本篇文章给大家分享的是有关如何在Android项目中自定义侧滑菜单栏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
自定义侧滑菜单的简单实现
不少应用中都有这种侧滑菜单,例如QQ这类的,比较有名开源库如slidingmenu。
有兴趣的可以去研究研究这个开源库。
这里我们将一种自己的实现方法,把学习的东西做个记录,O (∩_∩) O !
首先看效果图:
& lt; RelativeLayout xmlns: Android=癶ttp://schemas.android.com/apk/res/android" xmlns:工具=癶ttp://schemas.android.com/tools" android: layout_width=癿atch_parent" android: layout_height=癿atch_parent" 工具:上下文=? {relativePackage}。$ {activityClass}“;比; & lt; com.wind.view.SlideMenuView android: id=癅 + id/slideMenu" android: layout_width=癿atch_parent" android: layout_height=癿atch_parent"比; & lt;包括布局=癅layout/layout_menu"/比; & lt;包括布局=癅layout/layout_main"/比; & lt;/com.wind.view.SlideMenuView> & lt;/RelativeLayout>
接着我们需要实现SlideMenuView的java代码。
自定义,需要继承某个父类,通过重写父类的某些方法来增强父类的功能。
这里我们选择继承ViewGroup,一般自定义,需要重写onMeasure, onLayout和onDraw,正常情况下只要重写onDraw就可以了,特殊情况下,需要重写onMeasure和onLayout。
包com.wind.view; 进口android.content.Context; 进口android.util.AttributeSet; 进口android.util.Log; 进口android.view.MotionEvent; 进口android.view.View; 进口android.view.ViewGroup; 进口android.widget.Scroller; 公开课SlideMenuView延伸ViewGroup {//FrameLayout { 私有静态最终字符串标签=癝lideMenuView"; 预展menuView mainView; 私人int menuWidth=0; 私人照片卷轴照片卷轴; 公共SlideMenuView(上下文语境){ 超级(上下文); init (); } 公共SlideMenuView(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); init (); } 私人空间init () { 照片卷轴=new照片卷轴(getContext ()); }/* * *当一级的子视图全部加载玩后调用,可以用于初始化子视图的引用 * */@Override 保护空白>包com.wind.view; 进口android.view.View; 进口android.view.animation.Animation; 进口android.view.animation.Transformation;/* * *让指定视图在一段时间内scrollTo到指定位置 * @author管理员 * */公开课ScrollAnimation扩展了动画{ 私人视图视图; 私人int targetScrollX; 私人int startScrollX; 私人int totalValue; 公共ScrollAnimation(观点看来,int targetScrollX) { 超级(); 这一点。视图=视图; 这一点。targetScrollX=targetScrollX; startScrollX=view.getScrollX (); totalValue=https://www.yisu.com/zixun/this.targetScrollX startScrollX; int时间=Math.abs (totalValue); setDuration(时间); }/* * *在指定的时间内一直执行该方法,直到动画结束 * interpolatedTime: 0 - 1标识动画执行的进度或者百分比 *时间:0 - 0.5 - 0.7 - 1 *值:10 - 60 - 80 - 110 *当前的值=起始值+总的差值* interpolatedTime */@Override 保护无效applyTransformation (interpolatedTime浮动, 变换t) { 超级。applyTransformation (interpolatedTime t); int currentScrollX=(int) (startScrollX + totalValue * interpolatedTime); 视图。scrollTo (currentScrollX 0); } }
如上面的代码:
通过自定义动画来让视图在一段时间内重复执行这个动作。
关于getScrollX
将视图向右移动的时候,通过的观点。getScrollX得到的值是负的。
其实可以这样理解:
* getScrollX()表示的是当前的屏幕x坐标的最小值——移动的距离(向右滑动时移动的距离为正值,