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
- android实现拖动效果
- android 实现拖动效果
- Android实现拖动效果
- Android拖动效果实现
- Android开发实现拖动效果
- Android实现控件拖动效果
- 如何实现android控件的拖动效果
- android拖动imageview实现复制效果
- JavaScript实现拖动效果
- 实现拖动效果
- 实现拖动效果
- DIV拖动效果实现
- javascript实现拖动效果
- Html5实现拖动效果
- javascript 实现拖动效果
- JS拖动效果实现
- div实现拖动效果
- Android 图标拖动效果
- 类 CountDownLatch
- @property
- Opencv Mat与Iplimage的相互转换
- QCom MSM MDP显示驱动一些点的简记
- 在执行 COMMIT 和 ROLLBACK 操作时, 等待 "日志文件同步" 事件消耗了大量数据库时间。
- Android拖动效果实现
- 默写nginx并逐句分析 - ngx_buf.c
- uva 11234
- 骑自行车上班
- 理解ThreadLocal
- [编码问题] Python错误: SyntaxError: Non-ASCII character
- Ubuntu 12.04下fbTerm的使用
- cocos2d-x 2.1.4 android 开发环境搭建
- Linux指令初学——鸟哥的Linux私房菜(二)