android屏幕点击事件的分发机制

Android事件分发机制 最近在学习安卓的事件分发机制,实际上到目前为止还没有写过自定义View,在自定义View中如果需要能够响应手指的点击或者滑动事件就需要处理事件的分发,否则很容易出现冲突。写这篇博客是为了让自己能够更好的消化吸收,同时以后忘了能够很快的捡回来。此篇主要参考。 阅读详情

最近研究了一下android 屏幕中控件点击的分发机制,到底是如何实现的?????
为啥点击了屏幕就能响应,这么智能啊???
容器类控件和普通控件有什么区别???
容器类控件(如linearlayout)和里面的子控件(button)谁先响应这个点击事件????
touch事件和click事件到底有啥区别??
touch事件里面的down、move、up到底是怎么执行的???
话不多说直接给结论.

1、为啥点击了屏幕就能响应,有这么智能啊

首先android界面捕获事件的流程。用户在屏幕上点击一下后,
程序里面的OnClickListener是怎样收到这个事件的。
大致流程如下
用户点击-(硬件驱动部分)硬件产生一个中断,
往/dev/input/event*写入一个相应的信号->jni部分,android循环读取/dev/input/event*的事件,
再分发给WindowManagerServer,
最后再发到相应的ViewGroup和View。
这里可以通过往/dev/input/event*写信号的方式,
来达到模拟事件的目的,接下来关心的就是信号的协议了。

说到底就是一个硬件中断,我猜测是屏幕相当于一个感应器,
手点击了,会产生一个硬件中断信号,这个和底层硬件有关系了,
旧式的手机是点击实体按钮的,智能机器是点击屏幕了,
时代在进步啊,估计以后直接和人的大脑连接起来也说不定。。。
有人屏幕坏了,点击不能响应,就是这个原因,花钱换屏幕吧。。。
命令涉及到linux,android底层就是linux系统。

参考http://blog.youkuaiyun.com/fanjunjian1991/article/details/44648287

2、容器类控件和普通控件有什么区别

ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,
是android中所有布局的父类或间接父类,像LinearLayout、
RelativeLayout等都是继承自ViewGroup的。但ViewGroup实
际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。

这里写图片描述

package android.view;

public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource{。。。}


package android.view;
public abstract class ViewGroup extends View implements ViewParent, ViewManager {。。。}

3、容器类控件(如linearlayout)和里面的子控件(button)谁先响应这个点击事件

1. Android事件分发是先传递到容器类控件ViewGroup,
2. 再由ViewGroup传递到子View的。
对事件传递进行拦截,
3. onInterceptTouchEvent方法
返回true代表不允许事件继续向子View传递;
返回false代表不对事件进行拦截,传递给你点击的那个子控件,
如button,默认返回false。
4.一个事件按照ViewGroup--->子View传递,
子View如果将传递的事件消费掉,ViewGroup就不再对该事
件进行处理了。当然,再传递过程中,ViewGroup肯定可以
对事件进行操作的,因为ViewGroup先拿到啊!!!

4、touch事件和click事件到底有啥区别

几个重要的方法:
ViewGroup布局类:
重写的public boolean dispatchTouchEvent(MotionEvent ev){
...
view的super.dispatchTouchEvent(ev)...
onInterceptTouchEvent(ev)拦截点击事件传递给孩子...
mOnTouchListener.onTouch(this, event)...
onTouchEvent(event);...
}

view(button、textview一类):
view的 public boolean dispatchTouchEvent(MotionEvent ev)
...
mOnTouchListener.onTouch(this, event)...
onTouchEvent(event);...

核心部分源码:
    public boolean dispatchTouchEvent(MotionEvent event) {  
        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
                mOnTouchListener.onTouch(this, event)) {  
            return true;  
        }  
        return onTouchEvent(event);  
    }  
所以对于button来说顺序
dispatchTouchEvent
onTouch
onLongClick可能执行
onTouchEvent 里面有onclick
1
touchdown touchmove(可能多次) onlonglick touchmove(可能多次) touchup  onclick
2
touchdown onlonglick touchup  onclick
3
touchdown onlonglick touchmove(可能多次) touchup  onclick
4
touchdown touchmove(可能多次) onlonglick touchup  onclick

从源码中可以看出,这两个方法都是在View的dispatchTouchEvent
中调用的,onTouch优先于onTouchEvent执行。
如果在onTouch方法中通过返回true将事件消费掉,
onTouchEvent将不会再执行。
另外需要注意的是,onTouch能够得到执行需要两
个前提条件,第一mOnTouchListener的值不能为空,
第二当前点击的控件必须
是enable的。因此如果你有一个控件是非enable的,
那么给它注册onTouch事件将永远得不到执行。对于这一类控件,
如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。

5、touch事件里面的down、move、up到底是怎么执行的

onTouch的3个状态
ACTION_DOWN、
ACTION_MOVE与
ACTION_UP到底是怎么执行的???
给个总结,
顺序肯定是固定的,down---move(可能执行)---up(可能执行)
一句话调用三次view的dispatchTouchEvent(ev),相当于3个
不同的事件!!!每次执行完,给出一个true/false,
true---传递
false---消费事件,结束传递
前提父容器没有拦截事件分发:
点击按钮,必定执行一次控件(比如button)dispatchTouchEvent(ev),
执行ACTION_DOWN事件,如果dispatchTouchEvent返回true;
继续执行一次或者多次dispatchTouchEvent(ev),这个时候如果你手
指没有发抖会执行一次onLongClick方法,稍微移动一下会执行一
次ACTION_MOVE状态,非常敏感,执行很多次都正常,这个时候如果也是返回true;
如果你手指移开了,再执行一次dispatchTouchEvent(ev),
对应ACTION_UP,如果还是返回true;
会执行button的 onclick事件。

给一个demo,点击button后永远只执行一次ACTION_DOWN
CustomButton.java

package com.example.testtouch;

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

public class CustomButton extends Button {
    int i = 1;

    public CustomButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        Log.d("CustomButton", "dispatchTouchEvent 次数---" + i++);
        Log.d("CustomButton", "dispatchTouchEvent---" + event);
        // return super.dispatchTouchEvent(event);
        return false;
    }
}

MainActivity .java

package com.example.testtouch;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
    CustomButton bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = (CustomButton) findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.d("CustomButton", "onClick---" + v);
            }
        });
    }
}

打印结果,点击一次返回
这里写图片描述

由于事件分发到了子View,点击button,执行顺序是
父容器dispatchTouchEvent(tv)
找到点击的子空间button
子控件的dispatchTouchEvent(tv)
但是我注释了
// return super.dispatchTouchEvent(event);
直接返回false,
终止事件分发
actionmove
actionup
onclick
onlongclick
都不会执行。。。
打印一次actiondown 的log,结束。

好了,文章参考郭神
http://blog.youkuaiyun.com/guolin_blog/article/details/9097463/
http://blog.youkuaiyun.com/guolin_blog/article/details/9153747

Android 事件分发机制详解(上) Android事件分发机制是Android开发者必须了解的基础。当一个点击事件发生时,从Activity的事件分发开始(主要包括:dispatchTouchEvent()、onTouchEvent() 总结如下:那么ViewGroup的什么时候返回true / false?请继续往下看ViewGroup事件的分发机制。Android事件分发传递到Acitivity后,总是先传递到ViewGroup、再传递到View。流程总结如下:(假设已经经过了Acitivity事件分发传递并传递到ViewGroup。 阅读详情

相关推荐

Android事件分发机制流程解析

一:什么是事件分发 所谓事件分发,就是将一次完整的点击所包含的点击事件传递到某个具体的View或ViewGroup,让该View或该ViewGroup处理它(消费它)。分发是从上往下依次传递的,其中可能经过的对象有最上层Activity,中间层ViewGroup,最下层View。例如在屏幕中有一个Button控件,点击它时该次点击事件就会从Activity传到Button所在的ViewGroup...

yuncaidaishu的博客 3023

android 连续点击三次跳转到下一面

int count = 0; /**系统版本号 listener * * 实现连续点击3次以上,跳转到下一个activity * * @author 王晨*/ public OnPreferenceClickListener versionPrefListener = new OnPreferenceClickListener() { @Override pu

Elena_wang的专栏 5991

Android面试题(27)-android的事件分发机制

今天开始写一点关于view的知识,先从最基本的讲吧,android的事件分发机制,其实在我看来,android的事件分发机制在现实生活中经常能看到,所以我觉得还是很好理解的;先看看生活中常见的一种情形吧;比如说,现在你所在的公司中有一项任务被派发下来了,项目经理把项目交给你的老大,你的老大老大手下有很多人,看了看觉得你做很合适,把这个任务交给你了;你一看觉得还行,你就接下来了;这么一个小小场景大概...

pgg_cold的博客 1万+

为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?

原始网页直通车 这个问题,换句话描述就是:一个 view 在应用了属性动画后,该 view 在新的位置仍然能正确的收到分派的事件。 我们知道, view 调用 translationXX 方法后,虽然它在屏幕上显示的位置变了,但它的 [left, top, right, bottom] 是不变的,那 ViewGroup 是如何找到这个“偷跑” view 并正确分派事件的呢? 正常情况下,当手指按下时,触摸事件会经过 ViewGroup 中的 dispatchTouchEvent 方法筛选符合条件(手指在边

qq_26810645的博客 481

Android 事件分发机制详解/ 及Activity启动流程浅谈

目前网上的事件分发机制文章很多,可能大家看了很多,还是很懵逼,这篇文章是我自己总结的事件分发机制,提取了在事件分发机制中,最精华的部分,如果对事件分发还是不太清楚,可以看看这篇文章。

qq_45730283的博客 1582

Android之按钮点击事件(单击、双击、长按等)

因为按钮双击时仍然会先触发单击事件。如果只需要处理双击事件的话则不需考虑这一点,如果要在同一个按钮单击或双击时处理不同的内容,则需在双击时过滤掉单击事件。双击时过滤单击事件的思路可参考以前在Qt中的应用(QML之MouseArea双击时过滤掉单击事件):在按钮点击时开启定时器,判断300ms内有没有第二次点击,有的话表示双击,没有的话表示单击。处理多个按钮的点击事件时,可以使用上面的方式为每个按钮分别绑定事件监听器,也可以使用下面的方式定义一个实现监听器的类,当然,下面的方式结构更加清晰。

知道的越多,不知道的越多。 3313

Android事件分发机制详解:史上最全面、最易懂

点击事件由哪个对象发出,经过哪些对象,最终达到哪个对象并最终得到处理。这里的对象是指Activity、ViewGroup、View事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()三个方法协助完成经过上述3个问题,相信大家已经对Android的事件分发有了感性的认知,接下来,我将详细介绍Android事件分发机制。

w1142203475的博客 1万+

树莓派上基于ONNXRuntime与Qt的C++模型部署实战指南

本文详细介绍了在树莓派上使用ONNXRuntime与Qt进行C++模型部署的完整流程。从环境配置、依赖安装到交叉编译优化,再到Qt界面集成与ARM架构性能调优,提供了实战指南和常见问题解决方案,帮助开发者高效完成边缘设备上的AI应用部署。

ik6789012的博客 339

View的事件分发机制

什么是事件分发。当我们点击屏幕时,就产生了点击事件,这个事件被封装成了一个类:MotionEvent。而当这个 MotionEvent产生后,那么系统就会将这个MotionEvent传递给View的层级,MotionEvent在View中的层级传递过程就是点击事件分发。 1.MotionEvent MotionEvent类就是记录手指接触屏幕后所产生的一系列的事件,下面看几个常用的事件的类型与含义...

MonkeyLi的博客 799

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

设头皮上的目标点为P₀(x₀, y₀, z₀),需要在大脑皮层点集S上找到最合适的投影点P'。

Rose9614的博客 2208

从零配置XDMA:手把手教你PCIe BAR与AXI总线的地址转换(基于Vivado2023)

本文基于Vivado2023,手把手教你配置XDMA IP核,深入解析PCIe BAR与AXI总线地址转换的核心原理。通过实战步骤,详细说明如何正确设置BAR参数(如32/64位、预取使能)及地址映射,确保主机能稳定访问FPGA侧寄存器与内存,是解决PCIe通信调试难题的关键指南。

2w3e4r5t6y的博客 1213

从根源上看屏幕点击事件是如何传递到View中的(上)-事件获取

关于WMS处理以及View处理部分,后续会出一些文章讲解。文章将分两个阶段来对输入系统介绍。

yuhaibing111的博客 1101

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6149

Android:事件分发机制

笔者建议,读者可以先通读文章,不要过于纠结途中的相关方法的罗列,重点在于理解事件分发机制的流程即事件分发机制在Activity、ViewGroup、View三者之间的传递,对于文章图中罗列的相关方法可先了解其大致功能,一定要结合Android源码深入理解,先掌握概念,再回到代码中看具体实现逻辑事件分发中的”事件“是指什么?

qq_53092981的博客 798

Rockit VDEC解码实战:从零构建高效视频处理流水线

本文详细介绍了Rockit VDEC硬件解码模块在RK3568/RK3588平台的应用实践,涵盖开发环境配置、MPI接口使用、码流发送模式选择、内存管理优化及多路解码系统构建。通过实战案例展示如何利用VDEC实现高效视频处理流水线,显著降低CPU占用率,提升嵌入式多媒体开发效率。

ol789012的博客 305

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1606

调用某个按钮事件_高级UI晋升之触摸事件分发机制(一)

更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/4743806800. 前言鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇、实践篇与高级篇。(一)基础篇:从基本概念入手,介绍了分发机制中的核心方法,通过分析其核心逻辑,总结其事件分发机制。(二)实践篇:该篇设计了简单与复杂的两个demo样例,从现象与应用的角度去讲解分发机制的核心内...

weixin_39887183的博客 79

ABB机器人刷功能选项全一篇就够——不怕丢失程序和IO配置数据

ABB机器人刷功能选项

m0_66701835的博客 1260

【安卓R 源码】 View事件分发机制源码流程

1. 屏幕点击事件 事件 简介 ACTION_DOWN 手指 初次接触到屏幕 时触发。 ACTION_MOVE 手指 在屏幕上滑动 时触发,会多次触发。 ACTION_UP 手指 离开屏幕 时触发。 ACTION_CANCEL 事件 被上层拦截 时触发。 安卓中输入事件主要分为KeyEvent(键盘)和MotionEvent(触摸屏)两种,其中 KeyEvent是指键盘输入事件,本文主要讲 MotionEvent。 正常情况下,无论你手指在屏幕做多少操作

mike_jun的博客 2086

Python爬虫实战:高效爬取中国专利数据库的完整指南

在当今信息爆炸的时代,专利数据作为技术创新的重要指标,对企业研发、市场分析和学术研究都具有极高价值。中国作为全球专利申请量最大的国家,其专利数据库包含了海量的技术创新信息。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的中国专利数据库爬虫系统。中国专利数据库主要由国家知识产权局(CNIPA)维护,包含发明专利、实用新型专利和外观设计专利三大类。截至2023年,中国专利数据库已收录超过400万件发明专利和300万件实用新型专利。

2201_76125261的博客 1572

WINCC7.3破解文件

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

Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制

转载请注明本文出自xiaanming的博客(http://blog.youkuaiyun.com/xiaanming/article/details/21696315),请尊重他人的辛勤劳动成果,谢谢! 今天这篇文章主要分析的是Android的事件分发机制,采用例子加源码的方式让大家深刻的理解Android事件分发的具体情况,虽然网上很多Android的事件分发的文章,有些还写的不错,但是我还是决定

hyl963254113的专栏 595

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓事件分发机制

前言 Android的事件分发机制应该都要了解了解虽然水平菜,但是总要看。 网上有大量关于Android事件分发机制的文章,但都比较老,菜鸟看起来估计有点困难。 我这里推荐一篇比较好的文章,在文章末尾我再给出文章连接,如果看我的文章觉得说的浅薄或者想更深入了解可以去看看推荐的这篇文章。 本篇文章基于安卓9源码来讲诉事件分发 先小总结一下简单的理解就是下面这三个方法玩来玩去: dispatch...

weixin_41078100的博客 331

VB摄像头监控

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

Android事件分发机制(续)

继上次转发的一篇文章Android 事件分发机制,这两天决定自己跟踪源码一探究竟. 此次我们直接从ViewGroup事件分发开始. 首先,先要了解什么是ViewGroup ViewGroup和View有什么区别呢?实际上,ViewGroup就是一组View的集合,它包括子View或者子ViewGroup.是Android中所有布局的父类或者间接父类,例如RelativeLayout,Line

my9074的专栏 515

Android-事件分发机制(浅析)

Android-事件分发机制(浅析)前言 前言 事件分发机制是很重要的一块知识点,能熟悉事件分发有助于分析各种点击滑动失效,以及嵌套滑动问题; 童鞋们,我们来一起探索吧~~

weixin_43506260的博客 439

点击屏幕其它地方,让EditText失去焦点,并获取EditText输入的类容

隐藏软键盘的方法: [java] view plain copy   public static Boolean hideInputMethod(Context context, View v) {           InputMethodManager imm = (InputMethodManager) context          

丿灬安之若死 3603
上一篇: android应用开发常用的一些协议学习
下一篇: android性能优化学习
是辉仔啊
博客等级 码龄12年 13粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值