前阵子要的工作是给桌面(Launcher启动器,其实也是一个activity)添加一个触摸特效(一个View),而这个特效是每次触碰都会有,不管你在桌面上做什么操作都会显示特效!之前一直摸索着不知道如何入手,后来慢慢的实验之后才知道有个android触碰消息传递机制。自己摸索的确很慢,要是早点知道这个机制那将会事半功倍。
用户的每次触碰(onClick,onLongClick,onScroll,etc.)都是由一个ACTION_DOWN+n个ACTION_MOVE+1个ACTION_UP组成的,用户触碰必先有个ACTION_DOWN响应,用户触碰结束必然会有个ACTION_UP。(当然如果在途中被拦截,就可能不会有了!)那么View是如何分发消息和拦截消息呢?
1.View及其子类都会有的两个方法:
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
public boolean onTouchEvent(MotionEvent ev)
这个方法用来处理TouchEvent
2.特殊的View子类ViewGroup则还有一个方法:
public
boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3.分发
dispatchTouchEvent
收到触碰,则向最外层的View传递消息,再向子层的View分发
4.拦截:
onInterceptTouchEvent 拦截返回true表示要拦截消息,不要再向子View传递(这里的子View不是继承关系,而是包容关系)。返回false则表示不拦截消息,可以继续向下一层级的View传递消息,子View将可以dispatchTouchEvent 收到触碰消息再分发消息
5.消息处理:
onTouchEvent
处理事件,拦截了消息,或者是最后一个收到消息的View调用此方法来处理事件,若返回true,则表示正确接收并处理。若返回false则表示没有被处理,将向父View传递(这里的父View不是继承关系,而是包容关系)
6.举例示意图及手稿
android触碰消息传递机制,布布扣,bubuko.com
原文:http://blog.csdn.net/flycatdeng/article/details/38276355