Android拖动效果实现

来源:互联网 发布:网络交友的利的根据 编辑:程序博客网 时间:2024/06/04 19:18


        基于图片拖动效果,昨天我第一想到就是自定义view,通过调用onDraw()方法及invalidate()不断刷新重绘,但后来一想有没有更简单的方法呢,gallery好像也不太好,突然想起前段时间无聊看过一点点libgdx好像很合适。但可能有点大材小用了。俗话说杀鸡焉用牛刀。后来想到当前所用方法利用onTouch直接实现。一开始想到时,我突然觉得很简单了,但后来还是出了很多意想不到的情况。搞得云里雾里。这个demo看起来很简单,其实确实很简单。但里面包含的知识点还是很值得研究的。在贴代码之前,先讲讲其中知识点吧。

说到拖动,肯定就有触摸了,马上可以联想到触摸事件。记得以前只知道onTouchEvent事件就以为懂了,现在想想真是图样图森破,还是太年轻啊(自我吐槽下)。其实我根本不懂android 触摸事件的传递机制。现在通过这个demo学习了下。

android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:

 

1)public boolean dispatchTouchEvent(MotionEvent e)   这个方法用来分发TouchEvent

 

2)public boolean onInterceptTouchEvent(MotionEvent e)  这个方法用来拦截TouchEvent

 

3)public boolean onTouchEvent(MotionEvent e)        这个方法用来处理TouchEvent

这个我觉得很像windows编程里面的消息机制。从消息队列取出消息,然后分发消息,对象设置拦截器对感兴趣的消息进行拦截,最后进行处理。

 

 

首先系统调用Activity的dispatchTouchEvent方法,分发该事件。根据触摸事件的坐标,将此事件传递给ViewGroup1的dispatchTouchEvent处理,out则调用onInterceptTouchEvent 判断事件是由自己处理,还是继续分发给子View。此处由于ViewGroup1不处理Touch事件,故根据事件发生坐标,将事件传递给ViewGroup1的直接子View(即ViewGroup2)。

ViewGroup2中事件处理过程同上。如果view组件是clickable 表示其能处理Touch事件,故view中的onInterceptTouchEvent方法将事件传递给view自己的onTouchEvent方法处理。至此,此Touch事件已被处理,不继续进行传递。若是不能处理,则原路返回直到activity中看是否处理,若不处理就丢掉此消息。

上面三个函数返回都是boolean类型,从图中可以很容易理解就是里面的判断了。Touch事件通过dispatchTouchEvent以隧道方式从上往下传递。如果在一个View中执行onTouchEvent时返回 true的话,接下来的事件(ACTION_DOWN后的ACTION_UP,及可能在中间包含的若干个ACTION_MOVE,从 ACTION_DOWN至ACTION_UP仍会传递到这个View的onTouchEvent,如果返回 false的话,接下来的事件就不会再传递到这个View,而是执行其Parent View的onTouchEvent,每当一个View的onTouchEvent事件返回false,接下来的事件(如果还有的话)就会止步于这个 View的Parent View,每次上升一个层次,类似于冒泡方式。

此为返回true截图

此为返回false截图

这样导致运行效果也是不同的。

此demo还有个类似消息图标做得很简陋,我用的是相对布局,其实更好是用Framelayout。

(注意clickable=”true”)这样代表view接收touch事件

Demo效果图如下:



代码下载地址:http://download.csdn.net/detail/qiushuiqifei/5858837

 

原创粉丝点击