SlidingMenu(一)

来源:互联网 发布:php微信支付接口源码 编辑:程序博客网 时间:2024/05/22 15:21

activity_main.xml

<com.example.zhy_slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu"    android:id="@+id/id_menu"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:scrollbars="none"    zhy:rightPadding="100dp" >    <!-- 水平线性布局 -->    <LinearLayout        android:layout_width="fill_parent"        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>

layout_menu.xml

<?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="@drawable/img_frame_background" >    <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>    </LinearLayout></RelativeLayout>

attr.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <attr name="rightPadding" format="dimension" />    <declare-styleable name="SlidingMenu">        <attr name="rightPadding" />    </declare-styleable></resources>

MainActivity

package com.example.zhy_slidingmenu;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.Window;public class MainActivity extends Activity {private SlidingMenu mMenu;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);//加载布局文件setContentView(R.layout.activity_main);mMenu = (SlidingMenu) findViewById(R.id.id_menu);}public void toggleMenu(View view) {mMenu.toggle();}}

SlidingMenu

package com.example.zhy_slidingmenu;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;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;/** * 构造函数 * @param context * @param attrs */public SlidingMenu(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SlidingMenu(Context context) {this(context, null, 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()));break;}}a.recycle();}/** * 测量 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {/** * 显示的设置一个宽度 */if (!once) {LinearLayout wrapper = (LinearLayout) getChildAt(0);ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);ViewGroup content = (ViewGroup) wrapper.getChildAt(1);mMenuWidth = mScreenWidth - mMenuRightPadding;mHalfMenuWidth = mMenuWidth / 2;//菜单的宽度menu.getLayoutParams().width = mMenuWidth;//内容区域的宽度content.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) {// 将菜单隐藏--x为正值滚动条向右边移动,Menu向左移动this.scrollTo(mMenuWidth, 0);once = true;}}/** * 1、 *  scrollTo它表示移动到视图的那个坐标点。哪个视图调用这个方法,那么这个视图的(x,y)点就与手机屏幕的左上角对齐(也可以理解为,手机屏幕的左上角就移动到(x,y)坐标) *  * 2、 *  scrollBy(int dx, int dy) 说明:它表示在视图的X、Y方向上各移动dx、dy距离dx>0表示视图(View或ViewGroup)的内容从右向左滑动;反之,从左向右滑动dy>0表示视图(View或ViewGroup)的内容从下向上滑动;反之,从上向下滑动   3、getScrollX()说明:=手机屏幕显示区域左上角x坐标减去MultiViewGroup视图左上角x坐标=320getScrollY()说明:=手机屏幕显示区域左上角y坐标减去MultiViewGroup视图左上角y坐标=0(因为子视图的高度和手机屏幕高度一样) */@Overridepublic boolean onTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {//down move事件,Srollview自动处理// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏case MotionEvent.ACTION_UP://getScrollX() 就是当前view的左上角相对于母视图的左上角的X轴偏移量。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();}}}

ScreenUtils

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;public class ScreenUtils {private ScreenUtils() {throw new UnsupportedOperationException("cannot be instantiated");}/** * 获得屏幕高度 */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;}/** * 获得屏幕宽度 */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;}/** * 获得状态栏的高度 */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;}/** * 获取当前屏幕截图,包含状态栏 */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;}/** * 获取当前屏幕截图,不包含状态栏 */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;}}


0 0
原创粉丝点击