侧滑菜单

来源:互联网 发布:管家婆成本算法 编辑:程序博客网 时间:2024/05/07 10:02

      侧滑菜单,现在已是每个app的标配了,特使qq做出新意。

在这里整理了三个侧滑菜单!下面是效果图:


第一种,内容跟菜单一起滑动。

第二种,菜单滑动,内容不动。

第三种:内容滑动,菜单不动。

其实三种策划菜单的实现都是继承了HorizontalScrollView实现的,

第一种侧滑菜单的实现代码:

package com.wang.demo_slidingmenu.view;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.wang.demo_slidingmenu.R;import com.wang.demo_slidingmenu.util.ScreenUtil;public class SlidingMenu extends HorizontalScrollView{//菜单的右边距private int rightPadding;//屏幕宽度private int screenWidth;//菜单宽度private int menuWidth;//菜单的一半宽度private int halfMenuWidth;//控件宽度只初始化一次private boolean once=true;//标记菜单是否展开private boolean isOpen=false;public SlidingMenu(Context context) {this(context,null,0);}public SlidingMenu(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);screenWidth=ScreenUtil.getScreenWidth(context);Log.i("wangsongbin", screenWidth+"");TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);int count=typedArray.getIndexCount();for(int i=0;i<count;i++){int attr=typedArray.getIndex(i);switch(attr){case R.styleable.SlidingMenu_rightPadding:rightPadding=(int) typedArray.getDimension(attr, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()));break;}}typedArray.recycle();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if(once){LinearLayout ll_container=(LinearLayout) this.getChildAt(0);ViewGroup vg_item=(ViewGroup) ll_container.getChildAt(0);ViewGroup vg_content=(ViewGroup) ll_container.getChildAt(1);menuWidth=screenWidth-rightPadding;halfMenuWidth=menuWidth/2;vg_item.getLayoutParams().width=menuWidth;vg_content.getLayoutParams().width=screenWidth;}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){//隐藏菜单this.scrollTo(menuWidth, 0);once=false;}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {//对滑到菜单宽度一半时,做处理,要么显示,要么隐藏switch(ev.getAction()){case MotionEvent.ACTION_UP:int scrollX=getScrollX();if(scrollX>halfMenuWidth){//隐藏菜单this.smoothScrollTo(menuWidth, 0);}else{//显示菜单this.smoothScrollTo(0, 0);}return true;}return super.onTouchEvent(ev);}//展开菜单private void openMenu(){if(!isOpen){this.smoothScrollTo(0, 0);isOpen=true;}}//隐藏菜单private void closeMenu(){if(isOpen){this.smoothScrollTo(menuWidth, 0);isOpen=false;}}//切换菜单public void toggleMenu(){if(isOpen){closeMenu();}else{openMenu();}}}

第二种和第三种菜单都是在第一种侧滑菜单的基础上,借助ViewHelper类,对内容控件,或菜单列表控件做了动态的平移,达到不变的效果。这个类是一个jar包,里面的类从一个大神处获得!会在源代码中分享!

如:第二种侧滑:

@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if(l==0){leftOpen=true;}if(l>menuWidth){leftOpen=false;}else{rightOpen=false;}ViewHelper.setTranslationX(vg_content, l-menuWidth);}

第三种侧滑:

@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if(l==0){leftOpen=true;}if(l>menuWidth){leftOpen=false;}else{rightOpen=false;}ViewHelper.setTranslationX(vg_left, l);ViewHelper.setTranslationX(vg_right, l-2*menuWidth);}
还有一点,就是在父容器中,改变了子控件的加载顺序!即维持“不动”的子控件先加载!

如第二种侧滑的:

package com.wang.demo_slidingmenu.view;import android.content.Context;import android.util.AttributeSet;import android.widget.LinearLayout;public class SlidingLinearLayout extends LinearLayout{//改变子控件的绘制循序public SlidingLinearLayout(Context context, AttributeSet attrs) {super(context, attrs);//Tells the ViewGroup whether to draw its//children in the order defined by the method getChildDrawingOrder(int, int).setChildrenDrawingOrderEnabled(true);}@Overrideprotected int getChildDrawingOrder(int childCount, int i) {if(i==0){return 1;}else if(i==1){return 0;}else if(i==2){return 2;}return super.getChildDrawingOrder(childCount, i);}}

下面附上整个项目的源代码:

源代码下载




0 0
原创粉丝点击