目前抽屉式的Android应用还是比较多的,而且给人眼前一亮的感觉,其中“腾讯QQ”的拖拽效果的抽屉式样式就是一个很好的例子。通过查看他人源码发现,里面用到了ViewDragHelper和Gesturedetector.ViewDragHelper是framework中不为人知却非常有用的一个工具。
在2013年谷歌i/o大会上介绍了两个新的layout:SlidingPaneLayout和DrawerLayout,源码中都运用了ViewDragHelper来处理拖动。
现在,来先介绍一下ViewDragHelper的基本用法,然后介绍一下例子练练手就可以了。
处理手势识别的类有ViewDragHelper和Gesturedetector,但是,处理拖动方面,Gesturedetector手势类只能说勉为其难:Gesturedetector主要处理识别双击等手势
关于ViewDragHelper有如下几点:
1、涉及到一个回调类ViewDragHelper.Callback:是连接ViewDragHelper与view之间的桥梁(这个view一般是指拥有子view的容器即parentView,一般这个parentView是布局类型ViewGroup);
2、ViewDragHelper是通过其静态方法create创建出来的。
/*
这里创建出ViewDragHelper对象,其中阐述‘this’是ViewGroup,代表其依靠的父容器
‘1f’代表敏感度,0-1直接取值,值越大越敏感。
*/
ViewDragHelper mViewDragHelper = ViewDragHelper.create(this, 1f, new ViewDragCallBack());
3、你能够指定拖动的方向,并且ViewDragHelper可以检测是否触及边缘,相比自己去出来onTouchEvent()方法来处理边缘,实在是简单多了。
4、 ViewDragHelper不直接作用于被拖动的View,而是通过viewDragHelper的回调类去控制子view是否可以被拖动。所以拖动行为必须在其回调方法Callback中去想办法。
5、ViewDragHelper的本质其实是分析onInterceptTouchEvent和onTouchEvent的MotionEvent参数,然后根据分析的结果去改变一个容器中被拖动子View的位置( 通过offsetTopAndBottom(int offset)和offsetLeftAndRight(int offset)方法 ),他能在触摸的时候判断当前拖动的是哪个子View;
6、ViewDragHelper的实例方法 ViewDragHelper create(ViewGroup forParent, Callback cb) 可以指定一个被ViewDragHelper处理拖动事件的对象 ,但ViewDragHelper类的设计决定了其适用于被包含在一个自定义ViewGroup之中,而不是对任意一个布局上的视图容器使用ViewDragHelper。(个人观点,ViewDragHelper就是用来自定义布局控件,使用这个自定义控件可以拖动其中的子View实现想要的动画效果)
推荐个人写的Demo,通过源码学习。ViewDrageHelperDemo,仍在完善中。
博客首次发表于:xuqingsong.farbox.com