读书人

android 滑动菜单SlidingMenu的兑现

发布时间: 2012-11-16 14:12:15 作者: rapoo

android 滑动菜单SlidingMenu的实现

首先我们看下面视图:

android 滑动菜单SlidingMenu的兑现 android 滑动菜单SlidingMenu的兑现

这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下:

方法一:其实就是对GestureDetector手势的应用及布局文件的设计.

布局文件main.xml 采用RelativeLayout布局.

layout_right:这个大布局文件,layout_left:距离左边50dp像素.(我们要移动的是layout_left).

看到这个图我想大家都很清晰了吧,其实:我们就是把layout_left这个布局控件整理向左移动,至于移动多少,就要看layout_right有多宽了。layout_left移动到距离左边的边距就是layout_right的宽及-MAX_WIDTH.相信大家都理解.

布局文件就介绍到这里,下面看代码.

/*** * 获取移动距离 移动的距离其实就是layout_left的宽度 */void getMAX_WIDTH() {ViewTreeObserver viewTreeObserver = layout_left.getViewTreeObserver();// 获取控件宽度viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {@Overridepublic boolean onPreDraw() {if (!hasMeasured) {window_width = getWindowManager().getDefaultDisplay().getWidth();RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) layout_left.getLayoutParams();layoutParams.width = window_width;layout_left.setLayoutParams(layoutParams);MAX_WIDTH = layout_right.getWidth();Log.v(TAG, "MAX_WIDTH=" + MAX_WIDTH + "width="+ window_width);hasMeasured = true;}return true;}});}

在这里我们要获取屏幕的宽度,并将屏幕宽度设置给layout_left这个控件,为什么要这么做呢,因为如果不把该控件宽度写死的话,那么系统将认为layout_left会根据不同环境宽度自动适应,也就是说我们通过layout_left.getLayoutParams动态移动该控件的时候,该控件会伸缩而不是移动。描述的有点模糊,大家请看下面示意图就明白了.

我们不为layout_left定义死宽度效果:

android 滑动菜单SlidingMenu的兑现 android 滑动菜单SlidingMenu的兑现

getLayoutParams可以很清楚看到,layout_left被向左拉伸了,并不是我们要的效果.

还有一种解决办法就是我们在配置文件中直接把layout_left宽度写死,不过这样不利于开发,因为分辨率的问题.因此就用ViewTreeObserver进行对layout_left设置宽度.

ViewTreeObserver,这个类主要用于对布局文件的监听.强烈建议同学们参考这篇文章 android ViewTreeObserver详细讲解,相信让你对ViewTreeObserver有更一步的了解.

其他的就是对GestureDetector手势的应用,下面我把代码贴出来:



源码下载


怎么样,看着还行吧,我们在看下面一个示例:


android 滑动菜单SlidingMenu的兑现

简单说明一下,当你滑动的时候左边会跟着右边一起滑动,这个效果比上面那个酷吧,上面那个有点死板,其实实现起来也比较容易,只需要把我们上面那个稍微修改下,对layout_right也进行时时更新,这样就实现了这个效果了,如果上面那个理解了,这个很轻松就解决了,在这里我又遇到一个问题:此时的listview的item监听不到手势,意思就是我左右滑动listview他没有进行滑动。

本人对touch众多事件监听拦截等熟悉度不够,因此这里我用到自己写的方法,也许比较麻烦,如果有更好的解决办法,请大家一定要分享哦,再次 thanks for you 了.

具体解决办法:我们重写listview,对此listview进行手势监听,我们自定义一个接口来实现,具体代码如下:



源码下载


由于篇符较长,先说到这里,其实android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu也可以实现.具体参考下一篇文章:android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

先写到这里,有不足的地方请指出,

如果对您有帮助的话请记得赞一个哦. thanks for you。


















1楼easyer20122012-10-26 08:00
只前做项目的时候,刚好有这方面的需求,要是能早点看到楼主这篇文章就好了,就不要我花那么多时间去特意研究了,直接学习你的就OK了,不错!
Re: jj1205222012-10-26 09:42
回复easyer2012n谢谢,共同努力.

读书人网 >Android

热点推荐