一、onInterceptTouchEvent和onTouchEvent方法
涉及到touch事件的方法主要是以下两个,他们的简单区别:
onInterceptTouchEvent是在ViewGroup里面定义的,最小子View没有此方法,如TextView
onTouchEvent同样也是在view中定义的一个方法
down、move、up事件中down事件优先级最高(也是最早发生的)
二、事件的传递过程(底层和上层View是只从视效来划分的,底层代表容器更大):
两个方法,一个是对事件的分发截获处理,另外一个是对事件的消费处理,但其也可以统一的理解为确定事件的最终投递位置,如果先被截获了,则后续的子View不会再进行响应截获和消费事件,直接转为自己View的onTouch事件消费,如果不消费,则传递给上级(更底层)View的onTouch...(直到有人消费为止,若没人消费,则后续的move、up事件也不会再传递过去了)
简单来说,在含有多个层级View的容器中,点击最上层的一个view,android系统会首先通过DOWN事件来确认,事件的最终投递位置(消费位置),后续如果没有被其它底层View截获,则会一直按照确定好的投递位置来响应。当然在底层的view也可以通过在MOVE事件中后向的改变最终投递位置。
因为,第一次的DOWN事件确定投递位置,且一旦确定,则其上层的View不会再获取截获和消费事件的响应,所以,如果DOWN确定的投递位置是底层View,则上层的View在其它如MOVE/UP事件中消费或者改变投递位置操作会无效,而如果确定的投递位置是上层View,在底层View的MOVE事件截获可以改变投递,转至自身的onTouch处理,同时底层的View会直接响应cancel事件:
07-17 06:57:35.957: D/test(29622): LayoutView1, onInterceptTouchEvent1 action=0 ,return:false
07-17 06:57:35.957: D/test(29622): LayoutView2, onInterceptTouchEvent2 action=0 ,return:false
07-17 06:57:35.957: D/test(29622): MyTextView, onTouchEvent action=0 ,return:true(DOWN事件第一次确定了MyTextView为投递位置)
07-17 06:57:35.977: D/test(29622): LayoutView1, onInterceptTouchEvent1 action=2 ,return:false
07-17 06:57:35.977: D/test(29622): LayoutView2, onInterceptTouchEvent2 action=2 ,return:true(VIEW2 在MOVE事件中截获,改变了投递位置)
07-17 06:57:35.977: D/test(29622): MyTextView, onTouchEvent action=3 ,return:false(响应CANCEL事件)
07-17 06:57:36.377: D/test(29622): LayoutView1, onInterceptTouchEvent1 action=2 ,return:false
07-17 06:57:36.377: D/test(29622): LayoutView2, onTouchEvent2 action=2 ,return:false
07-17 06:57:36.377: D/test(29622): LayoutView1, onInterceptTouchEvent1 action=1 ,return:false
07-17 06:57:36.377: D/test(29622): LayoutView2, onTouchEvent2 action=1 ,return:false(MOVE改变的投递位置,导致UP事件终结于View2,虽然为false,但因在此被消费了,不会再传递至View1中)