android 中view 的OnTouchListener和OnClickListener的区别

Android事件分发机制相关知识点 一 事件分发机制过程 当触发一个touch事件时: 事件首先被分发到Activity的dispatchTouchEvent() 方法中,会先将事件分发给Window处理 Window调用super.dispatchTouchEvent()方法,super.dispatchTouchEvent()在PhoneWindow实现类中处理 然后具体实现是调用了DecorView的superDispatchTouchEvent()方法 最后DecorView调用ViewGroup的dispatchTouch 阅读详情

有时候会迷惑,OnTouchListener和OnClickListener究竟有什么区别。 通过源码分析一下。

一,OnTouchListener的触发逻辑

代码在View类 中

    public boolean dispatchTouchEvent(MotionEvent event) {
        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onTouchEvent(event, 0);
        }

        if (onFilterTouchEventForSecurity(event)) {
            //noinspection SimplifiableIfStatement
            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                return true;
            }

            if (onTouchEvent(event)) {
                return true;
            }
        }

        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
        }
        return false;
    }

分发touch事件时 先判断mOnTouchListener.onTouch() 是否处理了 事件,如果方法返回true(处理了),则不向下传递。

所以OnTouchListener 的触发时机是:手指一触摸就会触发。 action_down的时候就会触发。而且touchListener的字面意思"触碰监听"也比较贴切 。


二,OnClickListener的触发逻辑

代码也在View类 中

public boolean onTouchEvent(MotionEvent event) {
...
if (((viewFlags & CLICKABLE) == CLICKABLE ||
                (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    boolean prepressed = (mPrivateFlags & PREPRESSED) != 0;
                    if ((mPrivateFlags & PRESSED) != 0 || prepressed) {
                        // take focus if we don't have it already and we should in
                        // touch mode.
                        boolean focusTaken = false;
                        if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
                            focusTaken = requestFocus();
                        }

                        if (prepressed) {
                            // The button is being released before we actually
                            // showed it as pressed.  Make it show the pressed
                            // state now (before scheduling the click) to ensure
                            // the user sees it.
                            setPressed(true);
                       }

                        if (!mHasPerformedLongPress) {
                            // This is a tap, so remove the longpress check
                            removeLongPressCallback();

                            // Only perform take click actions if we were in the pressed state
                            if (!focusTaken) {
                                // Use a Runnable and post this rather than calling
                                // performClick directly. This lets other visual state
                                // of the view update before click actions start.
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClick();//触发点
                                }
                            }
                        }
...
}


下面看触发点performClick()

    public boolean performClick() {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);//触发点击事件
            return true;
        }

        return false;
    }


在onTouch()的事件处理的逻辑中,手指抬起 action_up 时,符合click的条件,则触发mOnClickListener的逻辑。


总结:

OnTouchListener的触发点:action_down 手指按下时

OnClickListener的触发点:action_up 手指抬起时

OnTouchListener 处理逻辑在OnClickListener之前,  所以OnTouchListener 的onTouch()如果返回true, 则 onTouchEvent ()中所有逻辑失效,当然OnClickListener也不会触发。




【Office激活】学校正版Office已激活成功仍弹出激活窗口 学校正版Office激活问题:已激活成功仍弹出激活窗口 阅读详情

相关推荐

TTL转RS422(B)工业级转换模块设计:从原理到实战部署

在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的

weixin_29195615的博客 341

View.OnTouchListener 触碰事件

开发Anroid软件的过程中,一开始会遇到成吨出现的问题。比如说,我照猫画虎的实现了View.OnClickLinstener事件,可以点击一个Button按钮,浏览事前定义好的图片了。 但我突发奇想,可不可以自定义一个手势,别人不知道的手势,念咒语一样,在自己的手机上面一划,出现一些我想要的效果呢。。。成吨的问题就出现了。。。。。。 这篇文章不打算攻克Gesture,先摸索一下View.OnTou

Peterclass的博客 3732

ADS 使用教程(一)Workspace, Library and Cell

简要介绍ADS的基本内容

Dirge19的博客 6610

Android View的onTouchListener、onTouchEvent、onClickListener执行时机

当返回false时,执行顺序为->->;当返回true时,只为执行;执行的前提是执行了且能执行事件。

故不积跬步无以至千里 1684

告别环境报错:Qt Creator里配置Android SDK/NDK/JDK路径的完整避坑指南

本文详细解析了在Qt Creator中配置Android SDK/NDK/JDK路径的完整避坑指南,深入探讨了路径检测的内部机制、构建套件配置的隐藏逻辑以及项目级与全局配置的优先级。通过实际案例和高级排查技巧,帮助开发者解决常见的环境报错问题,提升Qt安卓开发效率。

weixin_42548829的博客 238

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

View的Touch事件分发(一.初步了解)

View的Touch事件分发

yinianzhijian99的专栏 1115

Unity简单操作:PostProcessing的使用

Postprocessing是一个unity2018版本的集成后期插件,有了这个插件,之后用unity开发时,后期调整颜色、光晕等会很方便。 目录 新建一个postprocessing profile(配置文件)。​ 参数说明: 新建一个postprocessing profile(配置文件)。 在主相机下加一个组件PostProcess Layer。 注意:需要将相机的Layer层设置与Post Process Layer 下的Volume blending(体积混合)...

weixin_39114763的博客 7367

View->OnClickListener和OnTouchListener的区别和联系

OnClickListener和OnTouchListener的区别和联系的Kotlin代码

sunshine_guo的博客 434

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 338

【23】C++实战篇——C++报错:LNK2001:无法解析的外部符号 ,LNK2019: 无法解析的外部符号,原因分析及解决方法

该文分析了VS项目中出现的"无法解析的外部符号"LNK2001/LNK2019错误。问题表现为跨项目共享变量时,Projector项目无法解析Line项目中声明的外部变量ImgSavePath和ImgFormat。原因在于头文件声明了变量但未包含实现的源文件。解决方法是将getLine.cpp文件添加到Projector项目中。文章还总结了两种错误代码的区别:LNK2001通常对应变量缺失,LNK2019对应函数缺失。最后列出了具体的报错信息,包括无法解析的变量和函数符号。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2006

Android View的onTouchEvent方法与onTouchListener接口的onTouch方法优先级

Android View的onTouchEvent方法与onTouchListener接口的onTouch方法优先级onTouchListener接口及其onTouch方法onTouchEvent方法优先级 onTouchListener接口及其onTouch方法 onTouchListener是View内部定义的一个接口,下面是onTouchListener源码: /** * Interface definition for a callback to be invoked when a

Wang_Ritian的博客 2555

全国区块链职业技能大赛国赛考题前端功能开发

全国区块链职业技能大赛国赛考题区块链应用前端功能开发

本郡主是喵 1333

android触摸滑动事件,Android触摸滑动全解(一)——View中触摸事件详解

Android触摸滑动全解(一)——View中触摸事件详解View触摸事件概述View中的触摸事件可以分为两个部分。dispatchTouchEvent()和onTouchEvent()这两个方法,其中,dispatchTouchEvent()是用来传递触摸事件(返回true表示消费此次触摸事件,返回false表示不消费此次触摸事件);onTouchEvent用来处理触摸事件。OnTouchLis...

weixin_34489345的博客 1471

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

验证和分析Android的事件分发机制

转载请以链接形式标明出处: 本文出自:103style的博客 《Android开发艺术探索》 学习记录 base on Android-29 文中相关的源码有删减 可以带着以下问题来看本文: 事件分发的主要方法? 事件从Activity 传到对应的点击的View上的过程是怎么样的? ACTION_CANCEL 的调用时机? ViewGroup是怎么找到处理事件对应的子元素的? OnTouc...

103style 835

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android的touch事件分发机制-View篇

android的touch事件分发机制 先赞一下Markdown编辑器,很好用:) 网上讲解touch事件分发的文章已经很多了,看得多了,更觉得混乱。所以打算自己写一篇,顺理一下,也希望对后来者能有点用处。 在具体讲解之前,我想先回答几个常见的问题。 1. 为什么我们要了解touch的分发机制 2. touch的事件分发涉及到哪几个方法 3. view和viewgroup的分发机

A WAY 646

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android GUI之View事件处理

   Android中的事件分为按键事件和触屏事件,本篇文章将分析View是如何处理Touch事件的。在View中定义了许多触屏事件,比如OnClick、OnLongClick等等,这些事件都是由一次Touch中的动作如ACTION_DOWN、ACTION_MOVE、ACTION_UP组成的。   首先,我们先看一个简单的案例,Activity中只含有一个Button,我们为Button分别绑定...

weixin_33738578的博客 113

TouchEvent: dispatchTouchEvent(), onTouch() , onTouchEvent(), requestDisallowInterceptTouchEvent() 方...

Q: onTouchListener与onClickListener谁先执行?A: onTouchListener中的内容先执行。若其中的onTouch方法返回true,代表该事件已被onTouch消费掉了,则onClick不会再执行。 Q: onTouch和onTouchEvent有什么区别?A: 在某种情况下onTouch要先于onTouchEvent执行。onTouch是onTouchL...

weixin_30699831的博客 126

ViewGroup的事件分发

笔记1. ViewGroup的事件分发 dispatchTouchEvent() onInterceptTouchEvent() onTouchEvent() 这三个方法之间的大致关系如下 public boolean dispatchTouchEvent(MotionEvent event) { boolean consume = false;

_某某某的专栏 284

【Android】OnTouchListener 与 OnClickListener的使用区别

Android开发中OnTouchListener与OnClickListener的区别。

每天不是在写bug就是在写bug的路上 826

CheckBox的OnCheckedChangeListener、OnClickListener、OnTouchListener

看到CheckBox这一章的内容,发现监听CheckBox的事件有很多,OnCheckedChangeListener、OnClickListener、OnTouchListener。 于是写代码为了测试他们的区别。   package com.xc.ex04_04;   import android.app.Activity;  import android.os.Bundle;

技术宅Hito 1368

Android中onTouchListener、onTouchEvent、onClickListener有什么区别

在android开发过程中,我们

tuberrabbit的专栏 1758

Android OnTouchListener & OnTouchEvent & OnClickListener三者之间的关系?

首先是onTouchListener(以下简称TL)和onTouchEvent(以下简称TE),TL是一个接口类,调。motionEvent,后者可以知道touch有哪些相应的Action,并分别处理,CL可以监听控件点击事件。是一种Listener监听机制,而TL可以监听到点击事件在onTouch中处理,并传入两个参数View和。有了这两种事件处理机制,我们可以灵活运用,并获得一个相对更好的用户体验,记住对产品来。都是类里面的方法,我们可以通过这两种方法处理不同的touch交互Action。

yzwfeng的专栏 517
上一篇: android View touch的传递流程
下一篇: Genymotion does not start Android virtual device
javalive09
博客等级 码龄16年 43粉丝 281原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值