您的位置:首页 > 其它

【开源项目5】测滑菜单MenuDrawer的使用以及解析

2016-01-03 19:49 274 查看
在安卓中左右侧滑菜单的使用用的比ios多得多,可能是谷歌带的头吧,几乎所有的谷歌应用都有侧滑菜单。谷歌没有开放这个源码,在一个成熟的开源代码出现之前,大家都是各自为战,偶尔能看到一个勉强实现了的。MenuDrawer和其他的侧滑代码不同,他是一个性能高效且成熟的库。

在menuDraer出现之前我还用过slidemenu,效果差不多,但感觉没有MenuDrawer流畅,后来看了MenuDrawer和slidemenu的源码之后,才知道其实他们的实现思路是基本一致的,不过MenuDrawer的代码写的更好些。

MenuDrawer支持左、右、上、下四种侧滑方式,同时支持Overlay和Sliding两种模式。如下图:

但是MenuDrawer在github上的项目是gradle的android studio做的,直接将library导入到项目中会出现资源文件找不到的错误。因此要学会在eclipse中使用的话需要点耐心。官方已经有了其使用的方法,我这里就暂时不多说。其实要学会用这个库很简单,但是我的目的是要学会他实现滑动的基本方法,学会修改这个库,运用在更多的场景中。

我想弄明白下面的疑问:

在一个界面中如何自如的通过手势控制布局,想隐藏多少隐藏多少。

MenuDrawer的代码很多,但是其实我并不需要里面的很多功能,比如和actionbar的关联,甚至是上下滑动我也不需要,我只需要一个实现左滑菜单的范例,然后其他的我自己来,我不想一个项目下来用了很多别人的库,包含着一大堆跟业务无关的代码,而且我还不知道是拿来干嘛的。

经过研究,发现只需反复研究三个几个文件就能知道MenuDrawer的实现过程

这三个类以及他们的的继承关系如下:

MenuDrawer.java -> DraggableDrawer.java -> SlidingDrawer.java

MenuDrawer.java 这个是基本的类,继承自ViewGroup,他定义了许多公共方法和属性变量,MenuDrawer初始化也是在这个类中。其中包含如何加载菜单和主内容的layout,如何根据xml中的属性以及样式来获取一些初始化值,比如菜单的宽度,是否要阴影以及当前菜单的箭头指示资源文件等,绘制箭头和阴影的实现也在这个文件中。

DraggableDrawer.java实现了menu滑动的一些动画过度效果,其实感觉这里面的东西并不多。

SlidingDrawer.java这个是实现滑动的主要类,要知道如何通过手势滑动布局,这里就可以找到答案。

下面是SlidingDrawer的代码,不过是我修改过了的。

onInterceptTouchEvent和onTouchEvent是捕捉用户滑动事件的方法,其中onInterceptTouchEvent的用途是在onTouchEvent之前截获事件,并提供一次改变事件传递方向的机会。当用户滑动屏幕,onTouchEvent会被调用并执行case MotionEvent.ACTION_MOVE:下面的代码,通过比较当前触摸点和上次触摸点的位置记录x和y方向上的偏移量,然后根据这个偏移量移动继承自ViewGroup的MenuDrawer。其实MenuDrawer的这个过程和ViewPager非常相似。

onMoveEvent就是移动ViewGroup的方法。

根据上面的代码我们知道手指滑动屏幕的过程中onTouchEvent
onMoveEvent
setOffsetPixels
相继被调用。
setOffsetPixels
之后最终会在
offsetMenu中用offsetLeftAndRight()来移动ViewGroup。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: