View事件传递分析

Android的事件都是由许多touch事件组成,touch的第一个状态肯定是ACTION_DOWN,表示按下了屏幕,之后的事件可以是:
ACTION_MOVE // 表示为移动手势
ACTION_UP // 表示为离开屏幕
ACTION_CANCEL // 表示为取消手势,不会由用户操作产生,由程序产生
一个ACTION_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。

事件传递原则:
从底层View依次向上层View传递,过程就是一个接一个,某一个点后根据方法boolean的返回值判断是否要继续往下传递。在Android中,所有的事件都是从开始经过传递到完成事件的消费,这些方法的返回值就决定了某一事件是否是继续往下传,还是被拦截了,或是被消费了。

所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以此作为前提,因为所有的事件操作都发生在触摸屏上,而在屏幕上与用户交互的就是各种各样的视图组件(View),在Android中,所有的视图都继承于View,另外通过各种布局组件(ViewGroup)来对View进行布局,ViewGroup也继承于View。所有的UI控件例如Button、TextView都是继承于View,而所有的布局控件如RelativeLayout、容器控件例如ListView都是继承于ViewGroup。所以,事件操作主要就是发生在View和ViewGroup之间,View和ViewGroup中主要有如下3个方法来对这些事件进行响应:

1public boolean dispatchTouchEvent(MotionEvent event)

2、 public boolean onTouchEvent(MotionEvent event)

3、 public boolean onInterceptTouchEvent(MotionEvent event)   (ViewGroup)

dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。

onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的。

onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。

这里写图片描述

最上层View消耗ACTION_DOWN:

这里写图片描述

最上层View消耗ACTION_MOVE:

这里写图片描述

父View拦截MOVE:

这里写图片描述

父View拦截并消耗DOWN:

这里写图片描述

父View处理MOVE:

这里写图片描述

View的事件处理就分析到这,接下来会通过分析系统的Launcher源码来理解View事件传递与处理过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二竹本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值