QQ侧滑菜单效果
- 写一个SlideMenu类,继承自FrameLayout,因为如果继承自ViewGroup的话,需要我们自己来实现onMeasure方法,而该方法的实现一般比较麻烦且没有必要,所以选择继承系统的已有的控件FrameLayout,不用其他控件是因为FrameLayout最轻量级
- 在布局文件中给SlideMenu添加2个子布局,分别是菜单的布局和主界面的布局(代码略);
- 移动View的方法总结:
- 通过改变View的scroll的坐标来移动:
scrollTo(x,y);//滚动到指定位置 scrollBy(xOffset,yOffset);//滚动多少距离
- 通过改变View在父View中的布局的位置:
offsetLeftAndRight(offset);//同时更改view的left和right offsetTopAndBottom(offset);//同时更改view的top和bottom layout(l,t,r,b);
- 但是谷歌发现很多View移动的情景有相识点, 所以封装了ViewDragHelper类来帮助我们在ViewGroup中进行子View的移动:
- 通过改变View的scroll的坐标来移动:
ViewDragHelper类的介绍
- 谷歌在2013年I/O开发者大会上提出;
- 专门用于在ViewGroup中对子View进行拖拽处理;
- 在19(Android4.4)以及以上的v4包中;
- 本质是封装了对触摸事件的解析,包括触摸位置,触摸速度以及Scroller的封装,只需要我们在回调方法中指定是否移动,移动多少等等,但是需要注意的是:它只是一个触摸事件的解析类(如GestureDecetor),所以需要我们传递给它触摸事件,它才能工作;
如何创建ViewDragHelper对象
ViewDragHelper viewDragHelper = ViewDragHelper.create(this, callback);
- 由于ViewDragHelper只是触摸事件解析类,要想让ViewDragHelper工作,需要将触摸事件传递给它
public boolean onInterceptTouchEvent(MotionEvent ev) { //让ViewDragHelper帮助我们判断是否应该拦截 boolean result = viewDragHelper.shouldInterceptTouchEvent(ev); return result; } @Override public boolean onTouchEvent(MotionEvent event) { //将触摸事件传递给ViewDragHelper来解析 viewDragHelper.processTouchEvent(event); return true; }
- 在onFinishInflate方法中初始化子View的引用
protected void onFi