详细剖析 android onInterceptTouchEvent(MotionEvent event) 和 onTouchEvent(MotionEvent event) 的事件传递机制

EDKII环境配置完整版 参考博客【EDK2 UDK2018的环境搭建】:https://blog.csdn.net/qq_39155263/article/details/82965744下载EDK2 1.直接从https://github.com/tianocore/edk2/ 网站下载.zip压缩文件 2.运用svn 从http://svn.code.sf.net/p/edk2/code/trunk/edk2edk2下载 3.安装Visual Studio2017 安装其他Tool 1.IASL 从https.. 阅读详情

搬家后的博客链接: IT客栈 www.itkezhan.org


最近遇到 添加 ScrollView 之后 某些组件的 onTouchEvent() 没有响应,现在我们来解剖一下android 对于这种事件的处理和内部的传递机制。



1.ViewGroup代表可以包含子组件的类,例如我们的(LinearLayout、TableLayout、ScrollView);

2.ChildView 代表不能包含其他组件的类 ,例如我们的(Button、TextView、EditText);


对于 ViewGroup 有包含  onInterceptTouchEvent(MotionEvent event) 和onTouchEvent(MotionEvent event)

而且 ChildView 只包含了  onTouchEvent(MotionEvent event)


如果有疑问的话可以去看一下 Button 和 TextView 的 API 里面确实查不到 onInterceptTouchEvent(MotionEvent event)


===============================================================================


为了大家更好理解我制作成图片了。


需要用到的源代码   MainActivity.java  myScroll.java(继承 ScrollView)  myLayout.java(继承 LinearLayout)   myText.java(继承 EditText)   activity_main.xml(布局文件)

//MainActivity.java
package com.example.lab;


import android.app.Activity;
import android.os.Bundle;


public class MainActivity extends Activity
{
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
}


//myScroll.java
package com.example.lab;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class myScroll extends ScrollView
{

	
	public myScroll(Context context)
	{
		super(context);

	}

	public myScroll(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		
	}
	
	public myScroll(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) 
	{
		boolean b = super.onInterceptTouchEvent(event);
		Log.e("Info","Return " + b + " From myScroll OnInterceptTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());
		return b;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event)
	{

		boolean b = super.onTouchEvent(event);
		Log.e("Info","Return " + b + " From myScroll OnTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());
		return b;
	}
}


//myLayout.java
package com.example.lab;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class myLayout extends LinearLayout
{

	public myLayout(Context context)
	{
		super(context);
	}
	
	public myLayout(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}
	
	public boolean onInterceptTouchEvent (MotionEvent event)
	{
		boolean b = super.onInterceptTouchEvent(event);
		Log.e("Info","Return " + b + " From myLayout OnInterceptTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());
		return b;
	}
	
	public boolean onTouchEvent(MotionEvent ev)
	{
		boolean b = super.onTouchEvent(ev);;
		Log.e("Info","Return " + b + " From myLayout OnTouchEvent" + "---" + "GetActionEvent:" + ev.getActionMasked());
		return b;
	}
	
}


//myText.java
package com.example.lab;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.EditText;

public class myText extends EditText
{

	public myText(Context context)
	{
		super(context);
	}
	public myText(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}
	public myText(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event)
	{	
		boolean b = super.onTouchEvent(event);
		Log.e("Info","Return " + b + " From myText OnTouchEvent" + "---" + "GetActionEvent:" + event.getActionMasked());
		return b;
	}
}

avtivity_main.xml
<com.example.lab.myScroll xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.lab.myLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.example.lab.myText
            android:layout_width="match_parent"
        android:layout_height="match_parent"
            >
        </com.example.lab.myText>
        
    </com.example.lab.myLayout>

</com.example.lab.myScroll>


创建一个包名为 com.example.lab 然后把文件放到对应的地方就可以了运行了。


===========================================================================


有了源码,来说一下机制吧。

上面的布局文件  scroll 在最外层  layout 在中间  最里面的 text  如下面 这张图片


  

当我们触发屏幕事件的时候(点击屏幕、手指在屏幕上移动) 事件的传播流程是这样的。

如果 onInterceptTouchEvent()  返回的是 false(说明事件会传递下去),这里可以把  onInterceptTouchEvent() 看成是守门人,当它返回 false 的时候,证明目前这个类的 onTouchEvent 不是用来处理这个事件的,事件继续向内传播,如果返回 true 则由本类的onTouchEvent 进行处理,并停止事件的传播


制作这张图,看起来可能会直观一点。




其实onInterceptTouchEvent() 就是判断事件,OntouchEvent()就是处理事件。


技术在于交流,如有不懂请留言。我的QQ 1396686515;






核心组件大换血:Backbone与Neck魔改篇:YOLO26魔改Neck:引入BiFPN(双向特征金字塔),多尺度融合能力飙升 本文深入解析了YOLO26目标检测模型中Neck部分的优化策略,重点探讨了BiFPN(双向特征金字塔网络)的原理与实现。文章首先指出YOLO26原生FPN+PAN结构在多尺度特征融合上的局限性,特别是在小目标检测和边缘部署场景中的性能瓶颈。随后系统梳理了Neck网络的演进历程,从FPN、PANet到BiFPN和ASFF,详细对比了各架构的特点。核心部分展示了如何将BiFPN引入YOLO26,包括可学习权重融合、双向跨尺度连接等关键技术实现,并提供了PyTorch代码示例。本文为需要提升小目标检测性能或优化边 阅读详情

相关推荐

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

事件处理之onTouchEvent()和onTouch()方法精炼详解

一、前期基础知识储备 1.onTouchEvent()和onTouch()处理的对象是谁? 点击事件(Touch事件)。当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)。常见的点击事件包括:单击、双击、触摸、滑动。 Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象。 所以传入参数之后完整的方法展示:on...

Chin_Style的博客 5万+

用Typora画流程图和序列图:Mermaid语法实战教程(含常见报错解决)

本文是一份详细的Typora与Mermaid语法实战教程,教你如何在Markdown文档中高效绘制流程图和序列图。文章涵盖从环境配置、核心语法到复杂图表构建的全过程,并重点解析了常见报错原因与解决方案,助你将可视化图表无缝融入文档工作流。

weixin_29279101的博客 299

Android滑动冲突解决方案内外部拦截法及原理

本文接上篇Android滑动冲突一内部拦截外部拦截简介 一 ViewPager嵌套ListView的滑动冲突,内部拦截法为何ViewPager的onInterceptTouchEvent要做判断而不是直接返回true? 我们重温下Android事件分发二之ViewGroup如何处理事件中ViewGroup事件分发方法的源码。注意这个ViewGroup对应到我们例子的ViewPager class:ViewGroup: @Override public boolean dispa.

LJ_GOD的博客 5976

高精度磁力计RM3100 传感器LR振荡电路偏置电路分析

LR振荡器电路通过正向和反向偏置实现磁场测量。Sen-XY-f/Z-f传感器线圈作为电感元件构成LR弛张振荡电路,其振荡频率随磁场变化而改变。测量时,线圈一端接地,另一端交替通入正反向电流,通过两次偏置测量消除电路自身磁场干扰,仅保留外部磁场影响。MagI2C芯片通过高速时钟测量振荡次数和时间差,计算磁场强度。该设计具有抗干扰强、数字化输出和高分辨率等优势,是RM3100传感器高精度磁测量的核心原理。

bother3000的博客 1133

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1332

View的onInterceptTouchEvent(MotionEvent ev)和dispatchTouchEvent(MotionEvent ev) 解析

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含

临意 3280

2026年经纬恒润嵌入式笔试试卷带答案

2026年经纬恒润嵌入式笔试试卷涵盖车规MCU选型(如TriCore)、Cortex-M启动流程、指针数组区别、AUTOSAR OS任务调度(静态优先级抢占)、CAN总线特性(终端电阻必要性)、PID控制原理、SOME/IP协议应用等核心知识点。试题聚焦汽车电子系统设计,强调功能安全与实时性要求,涵盖中断处理、Bootloader升级机制、内存布局及可靠性设计(如看门狗、ECC校验)。多选题考察通信协议分层应用,填空题强化基础概念(如MSP初始值、SOME/IP、积分项作用)。整体体现车载嵌入式开发对底层原

Open 76

学习笔记:触摸事件MotionEvent

1. 铺垫 1.1 MotionEvent : 触屏事件 int ACTION_DOWN=0 : 代表down Int ACTION_MOVE=2 ; 代表move Int ACTION_UP=1 : 代表up 1.2 Activity boolean dispatchTouchEvent(MotionEvent event) : 分发事件 boolean onTouchEvent(Motio...

lyl0530的博客 455

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1584

网络攻防——kali操作系统基本使用

主要介绍如何搭建kali虚拟机,然后介绍了一个简单的攻击方法,切记,网络恶意攻击属于违法行为

weixin_46560512的博客 2万+

高阶形式对称性在M2膜理论中的应用与反常机制

高阶形式对称性(Higher-Form Symmetry, HFS)是量子场论中超越传统Noether对称性的重要扩展,特别适用于描述弦、膜等高维物体的对称性。HFS通过定义在余维子流形上的拓扑算子,实现了对p维扩展物体的对称性描述,为理论物理提供了新的工具。在M2膜理论中,HFS表现为1-形式对称性和0-形式对称性,分别描述膜的缠绕构型和拓扑激发。这些对称性的算子实现具有典型的拓扑特性,并在靶空间紧致维度存在非平凡同调环时形成离散对称群。此外,HFS的规范化过程中出现的't Hooft反常与膜世界体的拓扑

434

【AI应用实战-claude】在飞书上接入claudecode进行远程使用(十三)

本文介绍了三种将ClaudeCode接入飞书的方案,包括官方飞书CLI工具(推荐)、cc-connect中转工具和MCP协议集成。官方飞书CLI适合自动化办公场景,通过简单配置即可实现消息发送和文档管理;cc-connect适用于远程调用Claude功能,通过飞书群聊触发响应;MCP协议则适合开发者构建复杂工作流。文章提供了详细的操作步骤,并针对不同使用场景给出了选择建议。

1013

Android事件处理机制与实战技巧

事件处理是移动应用开发中的核心概念,特别是在Android平台上,它决定了用户与应用的交互体验。从技术原理上看,Android通过MotionEvent类封装触摸事件,包括ACTION_DOWN、ACTION_MOVE等基本类型,开发者可以通过getX()/getY()等方法获取精确的触摸坐标。在工程实践中,事件处理通常采用监听器方式或重写View回调方法两种模式,前者适合简单交互,后者则能实现更复杂的自定义行为。理解事件分发机制(从Activity到View的传递流程)对于解决滑动冲突等实际问题至关重要。

weixin_30825199的博客 291

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android事件分发机制深度解析:从原理到实战解决滑动冲突

在Android应用开发中,触摸事件处理是构建流畅交互体验的核心基础。其本质是一套基于View树的事件传递与响应机制,涉及事件分发、拦截与消费三个关键环节。理解这套机制的技术价值在于,它能帮助开发者精准控制用户操作的响应逻辑,避免常见的滑动冲突、点击穿透等问题,从而提升应用的整体交互质量。在具体应用场景中,无论是处理ScrollView内嵌ListView的经典滑动冲突,还是实现自定义ViewGroup的复杂手势交互,深入掌握事件分发原理都是实现预期效果的前提。本文结合ViewGroup、onInterce

weixin_30381317的博客 1057

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 事件分发机制与源码解析

Android 事件分发机制完全解析,带你从源码的角度彻底理解

OuO-1 的博客 405

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android的事件分发机制

参考文章:图解 Android 事件分发机制 这个文章很早我就看过了,但是只是知道是这个流程,具体怎么操作,点击事件如何传递依然有点迷,甚至连这个流程图是否正确都不敢持肯定态度,所以今天就来用代码实现下,毕竟眼见为实嘛。 debug过程太繁琐这里就不一步步贴了,直接上带注释的结果 /** * 事件分发测试 * activity层 */ public class MainActivity extends AppCompatActivity { private Linearlayou

每一次 我都会变的更强 260

深入解析Android事件分发机制:从原理到滑动冲突实战

在Android应用开发中,UI交互的流畅性直接关系到用户体验,其底层核心是事件分发机制。这一机制基于责任链模式,通过`dispatchTouchEvent`、`onInterceptTouchEvent`和`onTouchEvent`三个核心方法,将用户的触摸事件在View树中层层传递与处理。理解其原理对于实现复杂的自定义控件和优化交互至关重要。在实际工程实践中,嵌套滑动场景下的滑动冲突是常见挑战,开发者需要掌握根据滑动距离与方向判断拦截时机的技巧,或运用更现代的NestedScrolling接口进行协作

weixin_33860553的博客 416

2024安卓开发前景与事件分发机制深度解析:从原理到面试实战

在移动应用开发领域,UI交互的流畅性与响应性是衡量应用质量的核心指标之一,其背后依赖一套严谨的事件处理机制。理解事件分发原理,是掌握Android系统UI框架设计思想的关键,它采用责任链模式,通过dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent等核心方法的协作,决定触摸事件的最终消费者。这套机制的技术价值在于高效解决复杂的UI交互问题,如滑动冲突,这是提升用户体验、构建高性能应用的基础。在实际的工程实践中,开发者常需处理ViewPager内嵌横向滑动

weixin_33851604的博客 586

Android事件分发机制:从原理到实战解决滑动冲突

在Android应用开发中,UI交互的流畅性直接关系到用户体验,而触摸事件的处理是其中的核心。触摸事件从硬件层产生后,会经过一个由Activity、Window、ViewGroup和View构成的视图层级进行传递与处理,这一过程被称为事件分发机制。其本质是一个决策链与责任链的混合模型,核心在于理解dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent这三个方法的协作流程与调用顺序。掌握这套机制的技术价值在于,开发者能够从根本上诊断和修复诸如点击无响应、滑动

weixin_34122810的博客 308

手把手教你读懂源码,View的Touch事件传递流程详细剖析

都知道在Android中的事件主要包括三部分内容:分发事件dispatchTouchEvent、拦截事件onInterceptTouchEvent、消费事件onTouchEvent,但是其详细流程很多童鞋都不太清楚。

鑫鱻的博客 798

浅析Android View事件分发机制(应用侧)

就可以对落在自身区域中的触摸事件进行具体的处理,如果最终成功消费了触摸事件,那么这次触摸事件的分发处理流程就结束了。为了侧重分析触摸事件的分发流程,下面主要围绕关键代码进行分析,和事件分发流程关联不大的部分直接略过;通过对触摸事件进行转换处理,同时兼容子View的动画,保证点击事件在动画区域得到响应;一、模版方法模式:在分发触摸事件给子View之前,加入钩子来实现触摸事件的拦截;是否在之前处理过触摸事件,如果之前已经处理过触摸事件,则更新其处理过的。记录上次触摸事件的处理者,加速后续触摸事件的分发处理;

boker_han的博客 1655

JavaAndroid事件分发机制源码深度解读与交互优化实践

Java 异常处理进阶 自定义异常链设计与错误码规范落地

nSwe9Z3s2的博客 383

Android 7系统输入(一)从硬件到应用的事件旅程

本文是Android输入系统系列文章的第一篇,从宏观架构角度解析事件从硬件到应用的分发全链路。文章首先提出研究输入系统的必要性,指出应用层事件分发机制无法解决深层问题(如ANR机制、外设接入等)。随后通过分层架构图展示事件流水线:硬件驱动→内核层(/dev/input/eventX)→Native层(EventHub采集、InputReader加工、InputDispatcher分发)→Java层(InputManagerService)→应用层(ViewRootImpl)。重点剖析了Linux内核的inp

AfinalStone的专栏 419

Android点击事件全解析:从XML绑定到RecyclerView实战

在Android应用开发中,事件处理机制是连接用户交互与程序逻辑的核心桥梁。其基本原理是通过监听器模式,将用户操作转换为可响应的回调函数。掌握事件处理技术对于构建流畅、响应迅速的应用至关重要,它直接影响用户体验和应用性能。在实际工程实践中,开发者需要根据场景选择合适的事件绑定方式,例如在简单的原型验证中可以使用XML声明,而在复杂的业务逻辑中则推荐使用代码动态设置监听器。特别是在处理列表交互等高频场景时,合理的事件绑定能有效避免内存泄漏和性能问题。本文将深入探讨Android点击事件的多种实现方案,包括XM

weixin_30239339的博客 378

【朝花夕拾】Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑...

前言 转载请注明,转自【https://www.cnblogs.com/andy-songwei/p/10998855.html】谢谢! 在自定义View中,经常需要处理Android事件分发的问题,尤其在有多个输入设备(如遥控、鼠标、游戏手柄等)时,事件处理问题尤为突出。Android事件分发机制,一直以来都是一个让众多开发者困扰的难点,至少笔者在工作的...

aw1070的博客 263
上一篇: 解决 Android中用里ScrollView 之后 Activity 中的 onTouchEvent 失效问题
下一篇: 关闭本程序多个Activity
failure01
博客等级 码龄15年 18粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值