iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何实现Android触摸事件分发的原理分析
  • 386
分享到

如何实现Android触摸事件分发的原理分析

2023-06-26 04:06:24 386人浏览 八月长安
摘要

如何实现Android触摸事件分发的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一:前言最近在学Android的触摸事件分发,我觉得网上说的太杂太乱,而且有很多博客都

如何实现Android触摸事件分发的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。


    一:前言

    最近在学Android的触摸事件分发,我觉得网上说的太杂太乱,而且有很多博客都有明显的错误。什么自顶向下分发,自下向顶分发,什么拦截又一直消费什么什么之类,非常难懂。为了自己将来回顾可以更好的理解这块知识,也为了后来之人可以更好的学习,我写下这篇博客。

    二:说在前面的知识

    • 点击,滑动,松手都是由MotionEvent这个类来表示。

    • 屏幕上的一个事件序列是指以一个MotionEvent.action_down按下开始,以若干个MotionEvent.action_move移动事件在中间,再以一个MotionEvent.action_up作为结束的事件流。

    • view group是view的子类。view group和view都有dispatchTouchEvent方法;view group有onTnterceptTouchEvent和onTouchEvent方法,view 只有onTouchEvent方法。

    三:整体流程

    1:activity

    我们点击屏幕的所有事件,都会被第一个接收。

    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            onUserInteraction();//是一个空方法,如果想知道按下了屏幕,可以重写这个方法打印日志        }        if (getWindow().superDispatchTouchEvent(ev)) {//把这个事件传给window属性            return true;        }        return onTouchEvent(ev);    }

    2:window就是PhoneWindow

    每一个activity都会对应一个PhoneWindow(在onCreate方法之前、activity内部的attach方法中创建)。PhoneWindow含有一个decor view属性(setContentView中创建),phone window把事件传给decor view。 decor view继承于view group。点击事件现在传到decor view这里,就开始view group的事件分发逻辑了。

    3:view group

    view group收到点击事件, 进入dispatchTouchEvent, 如果满足以下二个条件中的任何一个条件:

    • 事件为down事件

    • 有一个子view或子view group在处理着事件流了

    mFirstTouchTarget !=null

    就进入判断,如果没有被禁用拦截(子view调用parent.requestDisallowed....)就执行, onInterceptTouchEvent代码。

    如果决定拦截,后面还会把mFirstTouchTarget置为null,这样,之后就不会在调用onInterceptTouchEvent了。而且之后的事件流都会由这个view group的dispatchTouchEvent处理

    如果不决定拦截,就遍历子view、子view group,挨个调用它们的dispatchTouchEvent如果没有人接收,那就调用自己的super.dispatchTouchEventview group的super.dispatchTouchEvent就是自己view那部分 的 dispatchTouchEvent

    4:view

    在view这一层,对于down事件,返回true就表示消费这个down事件之后的序列。具体看图。

    如何实现Android触摸事件分发的原理分析

     view调用setOnTouchLIstener可以设置OnTouchListener,重写onTouch方法。从源码中可以看出,若onTouch返回true,将不再回调onTouchEvent方法。不回调onTouchEvent的话,那onClickListener也不能回调了。

    四:一些关键点

    即使有view消费着一组事件,事件流由底向上传递时,依然会调用每一个view group的intercept拦截方法判断是否拦截。当一个view group遍历它所有的子view没有一个接收时,就会进入view模式,调用自己继承于view的那一个dispatchTouchEvent方法。如果自己不接收,那会交给调用自己的dispatchTouchEvent的那个父view.

    事件流没有什么自上而下,就是自下而上的。

    ViewGroup的实现负责将触摸事件沿着控件树向子控件进行派发,而View的实现则主要用于事件接收与处理工作。当view group没有子view接收时,view group作为一个“view”去处理。

    五:从源码看触摸事件分发

    由于专栏关注自定义控件,所以关于系统如何从硬件获取触摸事件以及传递到Activity的dispatchTouchEvent就不详细分解,下面将从Activity的dispatchTouchEvent方法来一步步看事件是如何被分发传递的:

    Activity中的dispatchTouchEvent:

        public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            onUserInteraction();        }        if (getWindow().superDispatchTouchEvent(ev)) {            return true;        }        return onTouchEvent(ev);    }

    其中onUserInteraction();是一个空实现,是系统留给我们的一个修改事件分发的一个方法,这里可以忽略。

    所以实际上Activity的dispatchTouchEvent方法是调用的PhoneWindow的superDispatchTouchEvent方法,如果superDispatchTouchEvent返回false,没有消费掉事件,那么才会再交给activity的onTouchEvent方法去处理,从这个角度来讲,如果所有地方都没有消费掉事件,最后接收事件的会是Activity的onTouchEvent方法。

    那么下面我们来看看PhoneWindow中的superDispatchTouchEvent方法:

        @Override    public boolean superDispatchTouchEvent(MotionEvent event) {        return mDecor.superDispatchTouchEvent(event);    }

    发现实际上调用的是DecorView对象mDecor的superDispatchTouchEvent方法,来看看DecorView的superDispatchTouchEvent方法:

            public boolean superDispatchTouchEvent(MotionEvent event) {            return super.dispatchTouchEvent(event);        }

    调用的super.dispatchTouchEvent,而再来看看这个DecorView的继承关系:

    private final class DecorView extends FrameLayout implements RootViewSurfaceTaker

    所以调用的是FrameLayout中的dispatchTouchEvent方法,而FrameLayout并没有重写dispatchTouchEvent方法,所以实际调用的是FrameLayout的父类 ---> ViewGroup中的dispatchTouchEvent方法,下面这个图描述了从系统得到MotionEvent实际到传递给DecorView的super.dispatchTouchEvent的过程:

    如何实现Android触摸事件分发的原理分析

    看完上述内容,你们掌握如何实现Android触摸事件分发的原理分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: 如何实现Android触摸事件分发的原理分析

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何实现Android触摸事件分发的原理分析
      如何实现Android触摸事件分发的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一:前言最近在学Android的触摸事件分发,我觉得网上说的太杂太乱,而且有很多博客都...
      99+
      2023-06-26
    • 关于Android触摸事件分发的原理详析
      目录一:前言二:说在前面的知识三:整体流程1:activity2:window就是PhoneWindow3:view group4:view四:一些关键点五:从源码看触摸事件分发总结...
      99+
      2024-04-02
    • Android开发Input系统触摸事件分发
      目录引言1. InputDispatcher 收到触摸事件1.1 截断策略查询2. InputDispatcher 分发触摸事件2.1 寻找触摸的窗口2.1.1 根据坐标找到触摸窗口...
      99+
      2023-03-02
      Android Input触摸事件分发 Android Input系统
    • Android怎么开发Input系统触摸事件分发
      本篇内容介绍了“Android怎么开发Input系统触摸事件分发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!引言Input系统: Inpu...
      99+
      2023-07-05
    • jQuery如何实现触摸事件
      这篇文章主要为大家展示了“jQuery如何实现触摸事件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现触摸事件”这篇文章吧。触摸事件//&nb...
      99+
      2024-04-02
    • Android AccessibilityService 事件分发原理分析总结
      目录AccessibilityService 监听事件的调用逻辑onAccessibilityEventonInterceptAccessibilityService 事件的外部来源...
      99+
      2024-04-02
    • HTML5触摸事件演化tap事件的示例分析
      HTML5触摸事件演化tap事件介绍,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。触摸事件是移动浏览器特有的HTML5事件,虽然click事件...
      99+
      2024-04-02
    • JS中触摸与手势事件的示例分析
      这篇文章给大家分享的是有关JS中触摸与手势事件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下1.触摸事件 包含 iOS 2.0 软件的 iPhone 3G ...
      99+
      2024-04-02
    • 利用DrawerLayout和触摸事件分发实现抽屉侧滑效果
      本文实例为大家分享了DrawerLayout和触摸事件分发实现抽屉侧滑效果的具体代码,供大家参考,具体内容如下效果展示 还是看代码实在,直接上菜了。 MainActivity的代码:public class MainActivity ext...
      99+
      2023-05-30
      drawerlayout 抽屉侧滑
    • 如何利用原生JS实现触摸滑动监听事件
      前言 今天写一个小Demo,有个地方涉及到了左滑右滑的逻辑,本来想着用插件来着,但是想到自己好久没用原生JS写滑动的监听了,所以试着用原生JS来实现了一下,毕竟温故而知新嘛,同时做...
      99+
      2024-04-02
    • android中事件分发机制的实现原理是什么
      android中事件分发机制的实现原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。android中的事件处理,以及解决滑动冲突问题都离不开事件分发机制,androi...
      99+
      2023-05-30
      android
    • iOS开发中的touchesBegan触摸事件怎么实现
      在iOS开发中,可以通过重写`touchesBegan`方法来处理触摸事件。`touchesBegan`方法会在用户触摸屏幕时被调用...
      99+
      2023-09-14
      iOS
    • Android中的监听触摸事件怎么在Fragment中实现
      本篇文章为大家展示了Android中的监听触摸事件怎么在Fragment中实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。activity的触摸事件 @Override public boolea...
      99+
      2023-05-31
      android fragment roi
    • 如何分析MySQL基础中的触发器和事件
      本篇文章给大家分享的是有关如何分析MySQL基础中的触发器和事件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。触发器我们使用MySQL的过程中...
      99+
      2024-04-02
    • VB.NET如何实现事件触发
      这篇文章主要为大家展示了“VB.NET如何实现事件触发”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何实现事件触发”这篇文章吧。VB.NET中的事件是一个非常重要的概念。对于初学者...
      99+
      2023-06-17
    • Android事件分发之View事件处理关键及示例分析
      目录目的View处理事件的关键View事件处理分析View.onTouchEvent()分析处理长按事件处理点击事件处理tap事件总结目的 网上已经有很多关于事件分发的优秀文章,为...
      99+
      2023-02-14
      Android事件分发View事件处理 Android View事件
    • Android事件分发机制深入刨析原理及源码
      目录前言事件分发原因事件分发对象事件分发方法事件分发参与者事件分发流程事件分发源码前言 在 Android 中,事件分发机制是一块很重要的知识点, 掌握这个机制能帮你在平时的开发中解...
      99+
      2023-05-16
      Android事件分发机制 Android事件分发机制原理
    • Android点击事件之多点触摸与手势识别的实现
      前言 最近遇到想要实现三指滑动监听的需求,实现代码不方便贴出来,但是思路还是可以记录一下。 Muilti-touch 双指缩放探索 首先要实现OnTouchListener接口,...
      99+
      2024-04-02
    • 解析写jQuery能触发事件的内部原理
      在 Web 开发中,jQuery 的事件绑定有着非常重要的作用。它可以帮助开发者感知页面的各种入参变化,实现页面的实时交互。而要实现事件绑定,我们就需要了解其中的内部原理。那么,jQuery 能触发事件吗?接下来,我们就来一探究竟。jQue...
      99+
      2023-05-14
    • 如何自己实现Android View Touch事件分发流程
      目录MotionEventViewViewGroup事件拦截 寻找目标视图,分发ACTION_DOWN 分发除ACTION_DOWN外的其他事件 使用 总结 Android Touc...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作