返回顶部
首页 > 资讯 > 精选 >Android中怎么实现 View事件分发
  • 435
分享到

Android中怎么实现 View事件分发

androidview 2023-05-30 23:05:39 435人浏览 泡泡鱼
摘要

这篇文章给大家介绍Android中怎么实现 View事件分发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。(1)ViewGroup.dispatchTouchEvent(event)boolean dispa

这篇文章给大家介绍Android中怎么实现 View事件分发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

(1)ViewGroup.dispatchTouchEvent(event)

boolean dispatchTouchEvent(MotionEvent event) { int action = event.getAction(); //判断ViewGroup是否拦截touch事件。当为ACTION_DOWN或者找到能够接收touch事件的子View 时,由onInterceptTouchEvent(event)决定是否拦截。其他情况,即ACTION_MOVE/ACTION_UP且 没找到能够接收touch事件的子View时,直接拦截。 boolean intercepted; if (action == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null) {  intercepted = onInterceptTouchEvent(event); } else {  intercepted = true; } //如果ViewGroup不拦截touch事件。在ACTION_DOWN时遍历所有子View,查找能够接收touch事件的 子View。如果找到则设置mFirstTouchTarget,并跳出循环。 boolean alreadyDispatchedToNewTouchTarget = false; if (!intercepted) {  if (action == MotionEvent.ACTION_DOWN) {   for (int i = childrenCount - 1; i >= 0; i--) {    if (!canViewReceivePointerEvents(child) ||     !isTransfORMedTouchPointInView(x, y, child, null)) {      continue;    }    if (dispatchTransformedTouchEvent(event, child)) {     //找到mFirstTouchTarget     newTouchTarget = addTouchTarget(child);     alreadyDispatchedToNewTouchTarget = true;     break;    }    }   } } //事件下发及消费。如果没找到能够接收touch事件的子View,则由ViewGroup自己处理及消费。 如果找到能够接收touch事件的子View,则由子View递归处理touch事件及消费。 boolean handled = false; if (mFirstTouchTarget == null) {  handled = dispatchTransformedTouchEvent(event, null); } else {  if (alreadyDispatchedToNewTouchTarget) {   handled = true;  } else {   while (touchTarget) {    handled = dispatchTransformedTouchEvent(event, child);   }  } } return handled;}//ViewGroup事件下发。如果无接收touch事件的子View,则由ViewGroup的父类(即View)下发touch事件如果child非空,则交由子View下发touch事件,子View可以是ViewGroup或View。boolean dispatchTransformedTouchEvent(MotionEvent event, View child) { boolean handled; if (child == null) {  handled = super.dispatchTouchEvent(event); } else {  handled = child.dispatchTouchEvent(event); } return handled;}

(2)View.dispatchTouchEvent(event)

//View的Touch事件分发。当外部设置了mOnTouchListener时,先交由mOnTouchListener.onTouch(event)消费。若未消费,则交给View的onTouchEvent(event)消费。onTouchEvent的实现是,如果设置了mOnClickListener,则执行mOnClickListener.onClick()点击事件。返回值为true,表示消费,否则未消费。boolean dispatchTouchEvent(MotionEvent event) { boolean result = false; if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {   result = true; } if (!result && onTouchEvent(event)) {  result = true; } return result;}boolean onTouchEvent(MotionEvent event) { performClick();}

3.总结

总结下ViewGroup的事件分发及消费过程:

整个过程包括3个部分:判断是否拦截 -> 查找接收touch事件的子View -> 事件下发及消费

判断是否拦截:

(1) ACTION_DOWN 或者 非ACTION_DOWN且找到接收touch事件的子View时,由onInterceptTouchEvent(event)决定是否拦截

(2) 非ACTION_DOWN,且未找到接收touch事件的子View时,标明需要拦截touch事件

这里解释下,影响ViewGroup是否能拦截touch事件有2个因素:是否 找到了接收touch事件的子View 和 onInterceptTouchEvent(event). 而查找接收touch事件的子View这一过程只需要在ACTION_DOWN的时候确定好就行。如果ACTION_DOWN的时候没找到,那么ACTION_MOVE和ACTION_UP肯定也找不到,因此touch事件直接被ViewGroup拦截。如果找到了接收touch事件的子View,那么ACTION_MOVE和ACTION_UP情况下还是要检查下ViewGroup的onInterceptTouchEvent(event),看下是否拦截。

查找接收touch事件的子View:

(1) 两种情况下查找:ACTION_DOWN且ViewGroup不拦截的情况下。

(2) 查找方法:遍历所有子View,如果touch事件的xy坐标在该ViewGroup的某个子View范围内,则针对该子View执行递归分发touch事件操作,如果找到有子View处理touch事件(return true),则跳出循环。

这里解释下查找条件。查找接收touch事件的子View,显然只需要ACTION_DOWN情况下即可,没必要ACTION_MOVE和ACTION_UP都检查,否则重复操作。如果ViewGroup都已经拦截了,显然不需要再去考虑子View怎么样了。

事件下发及消费:

(1)两种情况:ViewGroup下发及消费 或者 ViewGroup的子View下发及消费

(2)如果经过以上两步,没找到接收Touch事件的子View,那么由ViewGroup进行下发及消费,下发及调用流程是:ViewGroup.dispatchTouchEvent -> View.dispatchTouchEvent -> mOnTouchListener.onTouch -> onTouchEvent -> onClick

(3)如果找到接收touch事件的子View,则针对该子View执行touch事件递归下发及消费的操作

补充:

(1) 源码中,mFirstTouchEvent表示接收touch事件的子View

(2) 步骤2和3,都有执行dispatchTransformedTouchEvent(event, child)的操作,步骤2中只是为了查找接收touch事件的子View,步骤3主要目的是进行事件分发及消费。如果步骤2中针对某个子View已经执行了该方法,则步骤3中不再重复执行。个人理解,不知道是否有误。

4.结论

(1) 回调方法

ViewGroup:dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent

View: dispatchTouchEvent -> onTouch

(2) 调用顺序

Action执行顺序:ACTION_DOWN -> ACTION_MOVE -> ACTION_UP

ViewGroup: dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent()

View: dispatchTouchEvent -> onTouchEvent

事件分发传递顺序: Parent View -> Child View

ViewGroup1.dispatchTouchEvent -> ViewGroup2.dispatchTouchEvent
-> View3.dispatchTouchEvent
(紧跟着是View3.onTouchEvent)

事件消费传递顺序:Child View -> Parent View

View3.onTouchEvent -> ViewGroup2.onTouchEvent
-> ViewGroup1.onTouchEvent

关于Android中怎么实现 View事件分发就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Android中怎么实现 View事件分发

本文链接: https://lsjlt.com/news/222328.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中怎么实现 View事件分发
    这篇文章给大家介绍Android中怎么实现 View事件分发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。(1)ViewGroup.dispatchTouchEvent(event)boolean dispa...
    99+
    2023-05-30
    android view
  • Android View的事件分发机制
    一.Android View框架提供了3个对事件的主要操作概念。 1、事件的分发机制,dispatchTouchEvent。主要是parent根据触摸事件的产生位置,以及chi...
    99+
    2022-06-06
    view 事件 Android
  • 如何自己实现Android View Touch事件分发流程
    目录MotionEventViewViewGroup事件拦截 寻找目标视图,分发ACTION_DOWN 分发除ACTION_DOWN外的其他事件 使用 总结 Android Touc...
    99+
    2024-04-02
  • Android View 事件分发机制详解
    Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到这些问题,在一些面试笔试题中也常有人...
    99+
    2022-06-06
    view 事件 Android
  • Android View事件分发机制详解
    准备了一阵子,一直想写一篇事件分发的文章总结一下,这个知识点实在是太重要了。 一个应用的布局是丰富的,有TextView,ImageView,Button等,这些子View的外...
    99+
    2022-06-06
    view Android
  • Android事件分发机制(下) View的事件处理
    综述   在上篇文章Android中的事件分发机制(上)——ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析。在文章的最后ViewGroup的di...
    99+
    2022-06-06
    view Android
  • Android事件分发中事件是怎么来的
    本文小编为大家详细介绍“Android事件分发中事件是怎么来的”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android事件分发中事件是怎么来的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Andriod事件...
    99+
    2023-07-05
  • Android事件分发之View事件处理关键及示例分析
    目录目的View处理事件的关键View事件处理分析View.onTouchEvent()分析处理长按事件处理点击事件处理tap事件总结目的 网上已经有很多关于事件分发的优秀文章,为...
    99+
    2023-02-14
    Android事件分发View事件处理 Android View事件
  • Android View的事件体系实例分析
    这篇“Android View的事件体系实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android&nb...
    99+
    2023-06-29
  • Android View的事件分发机制简单理解
    View的事件分发机制1、前言2、基础2.1 MotionEvent类的基本用法。2.2事件分发的3个重要方法2.3分发事件的组件3.点击事件的...
    99+
    2022-06-06
    view 事件 Android
  • Android自定义View事件分发流程详解
    目录正文事件分发流程总结正文 事件传递和事件分发其实就是一个东西,叫法不一致罢了,你不用被名称所迷惑。有的人管这个叫事件传递机制,有的人则叫它事件分发机制。为了避免混淆,我这里统一...
    99+
    2023-02-02
    Android View事件分发 Android自定义View
  • 深入浅析Android项目中的 View事件分发机制
    本篇文章为大家展示了深入浅析Android项目中的 View事件分发机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体方法如下:public class MyButton extends But...
    99+
    2023-05-31
    view roi 目中
  • 谈谈对Android View事件分发机制的理解
    最近因为项目中用到类似一个LinearLayout中水平布局中,有一个TextView和Button,然后对该LinearLayout布局设置点击事件,点击TextView能够...
    99+
    2022-06-06
    view Android
  • android中事件分发机制的实现原理是什么
    android中事件分发机制的实现原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。android中的事件处理,以及解决滑动冲突问题都离不开事件分发机制,androi...
    99+
    2023-05-30
    android
  • Android中自定义view中事件分发机制与处理的示例分析
    这篇文章将为大家详细讲解有关Android中自定义view中事件分发机制与处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题引事件只有一个,多个人想要处理,处理的对象不是我们想给的对象就是事件...
    99+
    2023-06-25
  • 在Android项目中使用view实现一个点击事件
    这篇文章将为大家详细讲解有关在Android项目中使用view实现一个点击事件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 自定义view模板并实现点击事件的回调先看效果图:...
    99+
    2023-05-31
    android view roi
  • Android事件分发机制(上) ViewGroup的事件分发
    综述   Android中的事件分发机制也就是View与ViewGroup的对事件的分发与处理。在ViewGroup的内部包含了许多View,而ViewGroup继承自View...
    99+
    2022-06-06
    Android
  • Android中怎么实现OnFocuChangeListener焦点事件
    这篇文章将为大家详细讲解有关Android中怎么实现OnFocuChangeListener焦点事件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。打开“res/layout/activity...
    99+
    2023-05-30
    android
  • Android 点击事件分发
    Android 点击事件分发Activity中对事件的处理ViewGroup是如何进行事件处理的View的dispatchTouchEvent相...
    99+
    2022-06-06
    事件 Android
  • Android事件分发机制
    事件分发流程相关 一个事件发生后,首先从Acrtivity开始传递,然后一层一层往下传,从上往下调用dispatchTouchEvent方法传递...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作