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>


更多相关文章

  1. activity添加切换动画之后出现的黑色背景问题
  2. 安卓自定义View实现扇形图表
  3. 编译android源码前的准备
  4. OKhttp上传头像,调用相机相册进行裁剪
  5. MediaTest
  6. Android——ImageView设置圆形边框
  7. Android中fragment模式
  8. Java W3C 生成 XML
  9. android 动态设置textview 中划线 下划线

随机推荐

  1. 关于SQLite多线程的用法详解
  2. 关于J2ME 3D图形技术的实例详解
  3. c#对xml的CURD操作的代码示例
  4. 详解xml与Java之间的转换
  5. xml在powerbuilder中应用的代码示例
  6. 在asp下通过xml打包网站文件的方法
  7. Android开发中关于2个Xml合并问题的实例
  8. 在xml中写动画的实例详解
  9. 通过javascript xml xsl取值及数据修改第
  10. 分享如何订阅没有RSS输出的网站教程