QQ主界面的滑动效果的实现

需要注意的时本例中导入了com.nineoldandroids.view.ViewHelper的包,还用到了常用的ScreenUtils 辅助类来获取屏幕的信息。jar包可以在网盘中寻找。

另外,关于动画可参考

本文参照: 更高级用法: 神级用法:

所以在以后的实践中要注意jar的使用,以及常用辅助类的总结

主程序package com.test.mysideslip;import android.support.v7.app.ActionBarActivity;import com.test.sideslip.SlidingMenu;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.Window;import android.widget.LinearLayout;{private SlidingMenu mMenu;private LinearLayout mLinearLayout;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mMenu = (SlidingMenu) findViewById(R.id.id_menu);}(View view){mMenu.toggle();}(View view){//实现一点击主页面时,就进入主页面mMenu.toggle();}}滑动效果实现的主要程序package com.test.sideslip;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import com.nineoldandroids.view.ViewHelper;import com.test.mysideslip.R;{/*** 屏幕宽度*/private int mScreenWidth;/*** dp*/private int mMenuRightPadding;/*** 菜单的宽度*/private int mMenuWidth;private int mHalfMenuWidth;private boolean isOpen;private boolean once;private ViewGroup mMenu;private ViewGroup mContent;public SlidingMenu(Context context, AttributeSet attrs){this(context, attrs, 0);}public SlidingMenu(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);mScreenWidth = ScreenUtils.getScreenWidth(context);TypedArray a = context.getTheme().obtainStyledAttributes(attrs,R.styleable.SlidingMenu, defStyle, 0);int n = a.getIndexCount();for (int i = 0; i < n; i++){int attr = a.getIndex(i);switch (attr){case R.styleable.SlidingMenu_rightPadding:// 默认50mMenuRightPadding = a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50f,getResources().getDisplayMetrics()));// 默认为10DPbreak;}}a.recycle();}public SlidingMenu(Context context){this(context, null, 0);}(int widthMeasureSpec, int heightMeasureSpec){/*** 显示的设置一个宽度*/if (!once){LinearLayout wrapper = (LinearLayout) getChildAt(0);mMenu = (ViewGroup) wrapper.getChildAt(0);mContent = (ViewGroup) wrapper.getChildAt(1);mMenuWidth = mScreenWidth – mMenuRightPadding;mHalfMenuWidth = mMenuWidth / 2;mMenu.getLayoutParams().width = mMenuWidth;mContent.getLayoutParams().width = mScreenWidth;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}(boolean changed, int l, int t, int r, int b){super.onLayout(changed, l, t, r, b);if (changed){// 将菜单隐藏this.scrollTo(mMenuWidth, 0);once = true;}}(MotionEvent ev){int action = ev.getAction();switch (action){// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏case MotionEvent.ACTION_UP:int scrollX = getScrollX();if (scrollX > mHalfMenuWidth){this.smoothScrollTo(mMenuWidth, 0);isOpen = false;} else{this.smoothScrollTo(0, 0);isOpen = true;}return true;}return super.onTouchEvent(ev);}/*** 打开菜单*/(){if (isOpen)return;this.smoothScrollTo(0, 0);isOpen = true;}/*** 关闭菜单*/(){if (isOpen){this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}}/*** 切换菜单状态*/(){if (isOpen){closeMenu();} else{openMenu();}}(int l, int t, int oldl, int oldt){super.onScrollChanged(l, t, oldl, oldt);float scale = l * 1.0f / mMenuWidth;float leftScale = 1 – 0.3f * scale;float rightScale = 0.8f + scale * 0.2f;ViewHelper.setScaleX(mMenu, leftScale);ViewHelper.setScaleY(mMenu, leftScale);ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 – scale));ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.6f);ViewHelper.setPivotX(mContent, 0);ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale);}}屏幕测量辅助类package com.test.sideslip;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Rect;import android.util.DisplayMetrics;import android.view.View;import android.view.WindowManager;{private ScreenUtils() {UnsupportedOperationException(“cannot be instantiated”);}/*** 获得屏幕高度** @param context* @return*/(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);return outMetrics.widthPixels;}/*** 获得屏幕宽度** @param context* @return*/(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);return outMetrics.heightPixels;}/*** 获得状态栏的高度** @param context* @return*/(Context context) {int statusHeight = -1;try {Class<?> clazz = Class.forName(“com.android.internal.R$dimen”);Object object = clazz.newInstance();int height = Integer.parseInt(clazz.getField(“status_bar_height”).get(object).toString());statusHeight = context.getResources().getDimensionPixelSize(height);} catch (Exception e) {e.printStackTrace();}return statusHeight;}/*** 获取当前屏幕截图,包含状态栏** @param activity* @return*/public static Bitmap snapShotWithStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap bp = null;bp = Bitmap.createBitmap(bmp, 0, 0, width, height);view.destroyDrawingCache();return bp;}/*** 获取当前屏幕截图,不包含状态栏** @param activity* @return*/public static Bitmap snapShotWithoutStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();Rect frame = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);int statusBarHeight = frame.top;int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap bp = null;bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height – statusBarHeight);view.destroyDrawingCache();return bp;}}主布局文件====”100dp”android:background=”@drawable/c”><LinearLayout==”@layout/layout_menu” /><LinearLayout==”linear_toggle_Menu” ><Button=></LinearLayout></com.test.sideslip.SlidingMenu>layout_menu.xml布局文件==”match_parent” ><LinearLayout=”true”android:orientation=”vertical” ><RelativeLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content” ><ImageView===”@drawable/c” /><TextView===><RelativeLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content” ><ImageView===”@drawable/b” /><TextView===><RelativeLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content” ><ImageView===”@drawable/b” /><TextView===><RelativeLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content” ><ImageView===”@drawable/b” /><TextView===><RelativeLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content” ><ImageView===”@drawable/b” /><TextView===></LinearLayout></RelativeLayout>效果图接受失败,是我们不常听到或看到的一个命题,

QQ主界面的滑动效果的实现

相关文章:

你感兴趣的文章:

标签云: