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包)/*qq版侧滑与抽屉式侧滑的区别区别1;内容区域1.0-0.7的缩放scale:1.0-0.00.7+0.3*scale区别2:菜单的偏移量需要修改区别3:菜单显示时有缩放及透明度的变化缩放0.7-1.01.0-0.3*scale透明度:0.6-1.01。0-0.4*scale*/ViewHelper.setTranslationX(mMenu,mMenuWidth*scale*0.7f);//qq方式的偏移量//内容区域的缩放floatrightScale=0.7f+0.3f*scale;//设置缩放中心点,如果不设置会平移到屏幕右边缘(由于缩放的原因)ViewHelper.setPivotX(mContent,0);ViewHelper.setPivotY(mContent,mContent.getHeight()/2);ViewHelper.setScaleX(mContent,rightScale);ViewHelper.setScaleY(mContent,rightScale);//菜单的缩放floatleftScale=1.0f-0.3f*scale;ViewHelper.setScaleX(mMenu,leftScale);ViewHelper.setScaleY(mMenu,leftScale);//菜单的透明度floatleftAlpha=1.0f-0.4f*scale;ViewHelper.setAlpha(mMenu,leftAlpha);}}

attrs.xml

<?xmlversion="1.0"encoding="utf-8"?><resources><declare-styleablename="SildingMenu"><attrname="rightPadding"format="dimension"/></declare-styleable></resources>

左侧菜单布局文件 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>

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>


更多相关文章

  1. Android---16---EditText中输入特定的字符
  2. Android布局文件.xml中的自定义属性(结合封装的自定义View)
  3. 缩放图片 : matrix.setScale(0.5f,0.5f);
  4. android子菜单&&组菜单
  5. 2020.05.11-Python中调用zip包中的Python脚本
  6. Android:Context上下文菜单、ContextMenu
  7. SlidingMenu 用法(二)
  8. [控件]menu菜单
  9. Android有趣的开源框架

随机推荐

  1. Android中的dispatchTouchEvent()、onInt
  2. android ListView 属性
  3. Android(安卓)设置没有 actionBar的 样式
  4. Android(安卓)studio修改打包后的apk的名
  5. 安卓9.0 http请求数据失败解决办法
  6. Android发送短信方法实例详解
  7. Android横向智能刷新框架-SmartRefreshHo
  8. Failure [INSTALL_FAILED_TEST_ONLY: ins
  9. 安卓巴士Android开发神贴整理
  10. android底层开发