侧滑菜单
来源:互联网 发布:管家婆成本算法 编辑:程序博客网 时间: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
- 抽屉菜单与侧滑菜单. NavigationView
- 横滑菜单和侧拉菜单
- 侧滑菜单
- PopUpWindow 侧滑菜单
- SlidingMenu(侧滑菜单)
- 自定义侧滑菜单
- 侧滑菜单学习
- 侧滑菜单
- 折叠式侧滑菜单
- 侧滑菜单
- 侧滑菜单
- Android侧滑菜单
- 侧滑菜单1
- Android 侧滑菜单
- Android侧滑菜单
- SlidingMenuc侧滑菜单
- 侧滑菜单
- 侧滑菜单
- Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效
- 报表开发技巧之根据点击次数奇偶性排序之数值型
- maven环境变量配置以及与eclipse集成
- cordova的android APP载入图片设置
- LNMP 403问题
- 侧滑菜单
- polya补提链接
- Windows Phone 机器的信息
- 进程与线程栈大小的调整(精)
- Android ViewPager左右滑动月历
- http协议详解
- 一个JS文件引用多个JS文件
- Sping源码解析-源码下载
- C结构体、C++结构体 和 C++类的区别