android事件解析

来源:互联网 发布:诗人 知乎 编辑:程序博客网 时间:2024/05/16 08:21

1.Ontouch()事件判断手指按下、抬起、移动等事件。

onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下)。因此事件传递的顺序是先经过onTouch,再传递到onClick。

如果onTouch返回true,则onClick事件不执行,onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。

如果我们在onTouch方法里返回false,就会再去执行onTouchEvent(event)方法。

onTouchEvent(event)中调用onClick事件

触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法

onTouchEvent事件每次点击它的时候都会触发一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。

onTouch和onTouchEvent有什么区别,又该如何使用?

从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。

另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。

事件顺序:

dispatchTouchEvent--->onTouch--->onTouchEvent--->onClick


2.ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayout、RelativeLayout等都是继承自ViewGroup的。但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。

ViewGroup事件顺序:

dispatchTouchEvent--->onInterceptTouchEvent--->return true or false?--->

if(true){

 调用ViewGroup的onTouchEvent--->onClick

}else{

  调用孩子View的dispatchTouchEvent--->onTouch--->onTouchEvent--->onClick

}


1. Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。

2. 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。

3. 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。




0 0
原创粉丝点击