正文  软件开发 > 编程综合 >

android触碰消息传递机制

前阵子要的工作是给桌面(Launcher启动器,其实也是一个activity)添加一个触摸特效(一个View),而这个特效是每次触碰都会有,不管你在桌面上做什么操作都会显示特效!之前一直摸索着...

前阵子要的工作是给桌面(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.举例示意图及手稿