侧滑菜单(二)
16lz
2021-01-26
MainActivity.class
packagecom.test.sildingmenu;importcom.test.sildingmenu.view.CustomSidingView;importandroid.support.v7.app.ActionBarActivity;importandroid.view.View;importandroid.os.Bundle;publicclassMainActivityextendsActionBarActivity{privateCustomSidingViewmenu;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);menu=(CustomSidingView)findViewById(R.id.activity_main_scrollview);}publicvoidtoggleMenu(Viewview){menu.toggle();}}
主界面布局文件activity_main.xml
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res/com.test.sildingmenu"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/main_bg"><com.test.sildingmenu.view.CustomSidingViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/activity_main_scrollview"android:scrollbars="none"app:rightPadding="80dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id="@+id/activity_main_layout"android:orientation="horizontal"><includeandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id="@+id/activity_main_side_menu"layout="@layout/view_side_menu"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id="@+id/activity_main_main_layout"android:background="@drawable/loading_bg"android:orientation="vertical"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="toggleMenu"android:text="切换菜单"/></LinearLayout></LinearLayout></com.test.sildingmenu.view.CustomSidingView></RelativeLayout>
菜单布局文件view_side_menu.xml
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center_vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/view_side_menu_one_layout"android:padding="15dp"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_image1"android:src="@drawable/icon_base_info"android:layout_alignParentLeft="true"android:layout_centerVertical="true"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_text1"android:layout_toRightOf="@+id/view_side_menu_image1"android:layout_marginLeft="7dp"android:text="第一个item"android:layout_centerVertical="true"android:textColor="#fff"android:textSize="20sp"/></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/view_side_menu_two_layout"android:padding="15dp"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_image2"android:src="@drawable/icon_borrow_description"android:layout_alignParentLeft="true"android:layout_centerVertical="true"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_text2"android:layout_toRightOf="@+id/view_side_menu_image2"android:layout_marginLeft="7dp"android:text="第二个item"android:layout_centerVertical="true"android:textColor="#fff"android:textSize="20sp"/></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/view_side_menu_three_layout"android:padding="15dp"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_image3"android:src="@drawable/icon_borrow_user_info"android:layout_alignParentLeft="true"android:layout_centerVertical="true"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/view_side_menu_text3"android:layout_toRightOf="@+id/view_side_menu_image3"android:layout_marginLeft="7dp"android:text="第三个item"android:layout_centerVertical="true"android:textColor="#fff"android:textSize="20sp"/></RelativeLayout></LinearLayout>
自定义View
CustomSidingView.class
/****/packagecom.test.sildingmenu.view;importcom.nineoldandroids.view.ViewHelper;importcom.test.sildingmenu.R;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.util.AttributeSet;importandroid.util.DisplayMetrics;importandroid.util.TypedValue;importandroid.view.MotionEvent;importandroid.view.ViewGroup;importandroid.view.WindowManager;importandroid.widget.HorizontalScrollView;importandroid.widget.LinearLayout;/***@authorwanggenping*自定义属性(普通侧滑菜单)*/publicclassCustomSidingViewextendsHorizontalScrollView{privateLinearLayoutlayout;//包含在SidingView内的LinearLayoutprivateViewGroupmMenu;//左侧菜单privateViewGroupmContent;//主页面privateintmScreenWidth;//屏幕宽度privateintmMenuWidth;//dpprivateintmMenuRightPadding;privatebooleanonce;privatebooleanisOpen;/***未使用自定义属性时调用此构造方法**@paramcontext*@paramattrs*(属性)*/publicCustomSidingView(Contextcontext,AttributeSetattrs){this(context,attrs,0);}/***当使用了自定义的属性时会调用此构造方法**@paramcontext*@paramattrs*@paramdefStyle*/publicCustomSidingView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);//获取我们定义的属性TypedArrayarray=context.getTheme().obtainStyledAttributes(attrs,R.styleable.SildingMenu,defStyle,0);//自定义属性中的个数intn=array.getIndexCount();for(inti=0;i<n;i++){intattr=array.getIndex(i);switch(attr){caseR.styleable.SildingMenu_rightPadding:mMenuRightPadding=array.getDimensionPixelSize(attr,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()));break;default:break;}}array.recycle();WindowManagerwm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);DisplayMetricsoutMetrics=newDisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth=outMetrics.widthPixels;}publicCustomSidingView(Contextcontext){this(context,null);}/***设置子View的宽和高设置自己的宽和高*/@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){//由于onMeasure()方法可能被多长调用,所以我们这里只设置一次宽和高,不多长设置if(!once){layout=(LinearLayout)getChildAt(0);//layout中的第一个元素(即:menu)mMenu=(ViewGroup)layout.getChildAt(0);//layout中的第二个元素(即:主界面)mContent=(ViewGroup)layout.getChildAt(1);mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding;mContent.getLayoutParams().width=mScreenWidth;once=true;}super.onMeasure(widthMeasureSpec,heightMeasureSpec);}/***通过设置偏移量将menu隐藏*/@OverrideprotectedvoidonLayout(booleanchanged,intl,intt,intr,intb){super.onLayout(changed,l,t,r,b);if(changed){//menu初始状态,隐藏this.scrollTo(mMenuWidth,0);}}@OverridepublicbooleanonTouchEvent(MotionEventev){intaction=ev.getAction();switch(action){caseMotionEvent.ACTION_UP://隐藏在左边的宽度intscrollX=getScrollX();if(scrollX>=mMenuWidth/2){//带有动画的滑动this.smoothScrollTo(mMenuWidth,0);isOpen=false;}else{//显示menuthis.smoothScrollTo(0,0);isOpen=true;}returntrue;}returnsuper.onTouchEvent(ev);}/***打开菜单*/publicvoidopenMenu(){if(isOpen){return;}else{this.smoothScrollTo(0,0);isOpen=true;}}/***关闭菜单*/publicvoidcloseMenu(){if(!isOpen){return;}else{this.smoothScrollTo(mMenuWidth,0);isOpen=false;}}/***切换菜单*/publicvoidtoggle(){if(isOpen){closeMenu();}else{openMenu();}}/***抽屉式的侧滑效果需要此重新此方法,里面添加属性动画**/@OverrideprotectedvoidonScrollChanged(intl,intt,intoldl,intoldt){//l=getScrollX();super.onScrollChanged(l,t,oldl,oldt);floatscale=l*1.0f/mMenuWidth;//1-0//引入属性动画的jar包(由于属性动画支持3.0以上,所以需要向下兼容的话需要引入nineoldandroids-2.4.0.jar包)ViewHelper.setTranslationX(mMenu,mMenuWidth*scale);//普通抽屉式的偏移量}}
自定义属性文件attrs.xml
<?xmlversion="1.0"encoding="utf-8"?><resources><declare-styleablename="SildingMenu"><attrname="rightPadding"format="dimension"/></declare-styleable></resources>
更多相关文章
- activity添加切换动画之后出现的黑色背景问题
- 安卓自定义View实现扇形图表
- 编译android源码前的准备
- OKhttp上传头像,调用相机相册进行裁剪
- MediaTest
- Android——ImageView设置圆形边框
- Android中fragment模式
- Java W3C 生成 XML
- android 动态设置textview 中划线 下划线