android Touch事件传递自己理解

一、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中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值