Android侧滑--防QQ实现侧滑

来源:互联网 发布:乐视电视连不上网络 编辑:程序博客网 时间:2024/06/03 20:43

参考网上一位大神的代码,防QQ5.0实现侧滑(大神博客地址http://blog.csdn.net/lmj623565791/article/details/39257409


看一下效果图,实现以下效果


核心代码


1 .布局文件

 左侧菜单
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#0000" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:orientation="vertical" >        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ImageView                android:id="@+id/one"                android:layout_width="50dp"                android:layout_height="50dp"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_marginTop="20dp"                android:src="@drawable/img_1" />            <TextView                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_toRightOf="@id/one"                android:text="第1个Item"                android:textColor="#f0f0f0"                android:textSize="20sp" />        </RelativeLayout>        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ImageView                android:id="@+id/two"                android:layout_width="50dp"                android:layout_height="50dp"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_marginTop="20dp"                android:src="@drawable/img_2" />            <TextView                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_toRightOf="@id/two"                android:text="第2个Item"                android:textColor="#f0f0f0"                android:textSize="20sp" />        </RelativeLayout>        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ImageView                android:id="@+id/three"                android:layout_width="50dp"                android:layout_height="50dp"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_marginTop="20dp"                android:src="@drawable/img_3" />            <TextView                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_toRightOf="@id/three"                android:text="第3个Item"                android:textColor="#f0f0f0"                android:textSize="20sp" />        </RelativeLayout>        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ImageView                android:id="@+id/four"                android:layout_width="50dp"                android:layout_height="50dp"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_marginTop="20dp"                android:src="@drawable/img_4" />            <TextView                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_toRightOf="@id/four"                android:text="第一个Item"                android:textColor="#f0f0f0"                android:textSize="20sp" />        </RelativeLayout>        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ImageView                android:id="@+id/five"                android:layout_width="50dp"                android:layout_height="50dp"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_marginTop="20dp"                android:src="@drawable/img_5" />            <TextView                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:layout_toRightOf="@id/five"                android:text="第5个Item"                android:textColor="#f0f0f0"                android:textSize="20sp" />        </RelativeLayout>    </LinearLayout></RelativeLayout>
主界面<com.example.zhy_slidingmenu.SlidingMenu    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/id_menu"    xmlns:tools="http://schemas.android.com/tools"    xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu"    android:layout_width="wrap_content"    android:layout_height="fill_parent"    android:background="@drawable/img_frame_background"    android:scrollbars="none"    zhy:rightPadding="100dp" >    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="fill_parent"        android:orientation="horizontal" >        <include layout="@layout/layout_menu" />        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:background="@drawable/qq" >            <Button                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:onClick="toggleMenu"                android:text="切换菜单" />        </LinearLayout>    </LinearLayout></com.example.zhy_slidingmenu.SlidingMenu>

屏幕相关的辅助类package com.zhy.utils;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;/** * 获得屏幕相关的辅助类 *  * @author zhy *  */public class ScreenUtils{private ScreenUtils(){/* cannot be instantiated */throw new UnsupportedOperationException("cannot be instantiated");}/** * 获得屏幕高度 *  * @param context * @return */public static int getScreenWidth(Context context){WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);return outMetrics.widthPixels;}/** * 获得屏幕宽度 *  * @param context * @return */public static int getScreenHeight(Context context){WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);return outMetrics.heightPixels;}/** * 获得状态栏的高度 *  * @param context * @return */public static int getStatusHeight(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;}}

实现侧滑的核心代码package com.example.zhy_slidingmenu;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.zhy.utils.ScreenUtils;public class SlidingMenu extends HorizontalScrollView{/** * 屏幕宽度 */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);}@Overrideprotected void onMeasure(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);}@Overrideprotected void onLayout(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;}}@Overridepublic boolean onTouchEvent(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);}/** * 打开菜单 */public void openMenu(){if (isOpen)return;this.smoothScrollTo(0, 0);isOpen = true;}/** * 关闭菜单 */public void closeMenu(){if (isOpen){this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}}/** * 切换菜单状态 */public void toggle(){if (isOpen){closeMenu();} else{openMenu();}}@Overrideprotected void onScrollChanged(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.7f);ViewHelper.setPivotX(mContent, 0);ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale);}}


注意需要使用动画的效果,所以需要在项目里加入nineoldandroids-2.4.0.jar



0 0
原创粉丝点击