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
- SlidingMenu(一)
- SlidingMenu(一)
- 浅析SlidingMenu(一)
- 开源SlidingMenu笔记(一)
- 【Android】SlidingMenu测滑栏(一)
- SlidingMenu使用(一) 导入SlidingMenu
- Android练习之SlidingMenu(一)
- SlidingMenu
- SlidingMenu
- SlidingMenu
- SlidingMenu
- SlidingMenu
- SlidingMenu
- Slidingmenu
- Slidingmenu
- slidingmenu
- SlidingMenu
- slidingMenu
- 那些没有root权限的岁月:一分钟解决mutt No mailbox
- Android适配
- 晶振旁的电阻(并联与串联)
- 收录的一部分关于autoconf automake makefile的网址
- HDU 2025 查找最大元素
- SlidingMenu(一)
- js调用oc方法(ios自学笔记)
- 五个实用的Safari快捷键
- Windows驱动编程基础教程 (转)
- Unity3d程序必备的几种设计模式
- Canny边缘检测及createTrackbar
- module_param 模块参数
- RESTful 架构详解
- ORACLE数据库number类型使用hibernate反向生成JavaBean的数据类型