Android实现左侧滑动菜单
16lz
2021-12-04
效果图:
SlideActivity.java:
package com.demo.slide;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.Window;import com.demo.broadcast.R;public class SlideActivity extends Activity{private SlidingMenu mLeftMenu ; @Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.slide_main);mLeftMenu = (SlidingMenu) findViewById(R.id.id_menu);}public void toggleMenu(View view){mLeftMenu.toggle();}}
SlidingMenu.java:
package com.demo.slide;import android.content.Context;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;public class SlidingMenu extends HorizontalScrollView{private LinearLayout mWapper;private ViewGroup mMenu;private ViewGroup mContent;private int mScreenWidth;private int mMenuWidth;// dpprivate int mMenuRightPadding = 80;private boolean once;private boolean isOpen;/** * 未使用自定义属性时,调用 * * @param context * @param attrs */public SlidingMenu(Context context, AttributeSet attrs){this(context, attrs, 0);}/** * 当使用了自定义属性时,会调用此构造方法 * * @param context * @param attrs * @param defStyle */public SlidingMenu(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth = outMetrics.widthPixels;mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());}public SlidingMenu(Context context){this(context, null);}/** * 设置子View的宽和高 设置自己的宽和高 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){if (!once){mWapper = (LinearLayout) getChildAt(0);mMenu = (ViewGroup) mWapper.getChildAt(0);mContent = (ViewGroup) mWapper.getChildAt(1);mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth- mMenuRightPadding;mContent.getLayoutParams().width = mScreenWidth;once = true;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/** * 通过设置偏移量,将menu隐藏 */@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);}}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){case MotionEvent.ACTION_UP:// 隐藏在左边的宽度int scrollX = getScrollX();if (scrollX >= mMenuWidth / 2){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)return;this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}/** * 切换菜单 */public void toggle(){if (isOpen){closeMenu();} else{openMenu();}}}
slide_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.demo.slide.SlidingMenu android:id="@+id/id_menu" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal" > <include layout="@layout/left_menu" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="toggleMenu" android:text="切换" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="20dp" android:text="我是主content" android:textColor="#ff00ff" android:textSize="20sp" /> </LinearLayout> </LinearLayout> </com.demo.slide.SlidingMenu></RelativeLayout>
left_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="#000000" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="我是左侧Menu" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout></RelativeLayout>
更多相关文章
- Android的状态栏通知(Notification)
- Android(安卓)RecyclerView 分割线(DividerItemDecoration )
- Unity调用Android保存图片到相册
- Android点击效果加边框
- ANDROID截屏
- 在Android(安卓)WebView中设置Cookie
- Android(安卓)自定义ProgressBar--进度自己设置图片
- 获取Android唯一设备号
- Android中onSaveInstanceState和onRestoreInstanceSt...