Android中事件处理机制一分钟理清思路
刚开始对我事件处理机制的概念还挺模糊的,而网上的讲解又很杂很乱.那么现在在这里你可以快速理清事件处理机制了.
首先用处肯定得知道:
事件处理机制就是为了应对嵌套式的布局中强焦点和弱焦点的点击事件进行自我定义。可以说是Android软件设计中重要的技术设计方法。
当然如果你想问嵌套式布局是什么?
嵌套式布局就如下图:一个界面中有父view,子view和子控件,但是点击事件的处理方案就可以通过事件处理机制来区分开来了
怎么使用:
ViewGroup的相关事件有三个:onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。
代码详解(更清晰明了):
dispatchTouchEvent true dispatch直接消费
(往前一层) false 传递给上层ontouch
super.dispatchTouchEvent(ev)分发当前对象的intercept
onInterceptTouchEvent true 交给当前view的ontouch处理
false 交给子view的分发
super.dispatchTouchEvent(ev) 同false
onTouchEvent true接收并消费
false 由上层ontouch接收
super.dispatchTouchEvent(ev)同false
代码如下:
public class AView extends RelativeLayout {public AView(Context context) {super(context);}public AView(Context context, AttributeSet attrs) {super(context, attrs);}public AView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {System.out.println("AView.dispatchTouchEvent"+"A分发"+" 默认分发给拦截");return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {System.out.println("AView.onInterceptTouchEvent"+" A拦截"+" false不拦截");return false;}@Overridepublic boolean onTouchEvent(MotionEvent event) {System.out.println("AView.onTouchEvent"+" A消费"+" false不消费");return false;}}
B视图
public class BView extends RelativeLayout {public BView(Context context) {super(context);}public BView(Context context, AttributeSet attrs) {super(context, attrs);}public BView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {System.out.println("BView.dispatchTouchEvent"+" B分发"+" 默认分发给拦截");return super.dispatchTouchEvent(ev); //为了往下一层走}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {System.out.println("BView.onInterceptTouchEvent"+" B拦截"+"false不拦截");return false;}@Overridepublic boolean onTouchEvent(MotionEvent event) {System.out.println("BView.onTouchEvent"+" B消费"+"false不消费");return false;}
c子控件
public class CView extends TextView {public CView(Context context) {super(context);}public CView(Context context, AttributeSet attrs) {super(context, attrs);}public CView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onTouchEvent(MotionEvent event) {System.out.println("CView.onTouchEvent"+" C消费"+"TextVeiw消费结束");return true;}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {System.out.println("CView.dispatchTouchEvent"+" C分发"+"直接给touch");return onTouchEvent(ev); //直接传递给消费}}
xml布局:
<?xml version="1.0" encoding="utf-8"?>
<com.example.lsh.shijianchuli.AViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.lsh.shijianchuli.MainActivity"><com.example.lsh.shijianchuli.BViewandroid:layout_width="300dp"android:layout_height="300dp"android:background="#f00"><com.example.lsh.shijianchuli.CViewandroid:layout_width="100dp"android:layout_height="100dp"android:background="#ff0"android:text="事件处理的text子控件"/></com.example.lsh.shijianchuli.BView></com.example.lsh.shijianchuli.AView>
结果如下图:
分析:这是为了将所有都view都分发到的形式,可以在中间直接拦截消费。子控件可能在布局中有很多个,并且子控件无法重写拦截,所以不会只执行一遍。
A.onInterceptTouchEvent-->B.onInterceptTouchEvent-->C.touchEvent(最深的子视图没重写onInterceptTouchEvent)-->C.touchEvent-->B.touchEvent-->A.touchEvent.也就是说拦截事件是父视图优先有子视图进行拦截,处理事件是子视图优先父视图进行处理。
注意点:
如果在A的分发为true,意味着父view的上一层(但是并没有),实际会以遍历来回的形式的形式执行六次dispatchTouchEventA分发,三个view往返两次。
工程结构图:
Android中事件处理机制一分钟理清思路相关推荐
- Android中Log机制
Android中Log机制 写Log过程 首先从Java层入手 下面是定义的Log级别:public static final int VERBOSE = 2;public static final ...
- android中handler机制,如何使用?,Android中的Handler机制
一.Handler概述 二.Handler发送消息的方法 三.MessageQueue的enqueueMessage() 四.Message的when字段 五.子线程中使用Handler 六.Loop ...
- Android 触摸事件处理机制
Android 触摸事件的处理主要涉及到几个方法: onInterceptTouchEvent(), dipatchTouchEvent(), onTouchEvent(), onTouch() ...
- [转]Android中handler机制的原理
Andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...
- Android中IPC机制详解
本文部分内容参照<Android开发艺术探索> IPC是什么? IPC全称为Inter-Process Communication,译为"跨进程通信",在这里要着重提一 ...
- android双亲委派机制,3分钟了解Java双亲委派机制
你得先知道 在介绍双亲委派机制的时候,不得不提 ClassLoader .说ClassLoader之前,我们得先了解下Java的基本知识. Java是运行在Java的虚拟机(.class 的 JVM中 ...
- android事件处理主要方法,详解Android的两种事件处理机制
UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...
- android handler的机制和原理_第一百八十回:Android中的Handler机制九
各位看官们大家好,上一回中咱们说的是Android中Handler机制的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起Talk Android吧! 看官们,由于时间的原因我们在上一回中只 ...
- 一起Talk Android吧(第一百八十六回:Android中的AsyncTask机制五)
各位看官们大家好,上一回中咱们说的是Android中AsyncTask机制的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起Talk Android吧! 看官们,我们在前面章回中通过具体的 ...
最新文章
- 超越Google,快手落地业界首个万亿参数推荐精排模型
- 一篇讲清:数据采集中的安全与隐私
- python进阶(十七)xml(下)
- pat 乙级 1047 编程团体赛(C++)
- 苹果市值突破2万亿美元;华为推出PC版HMS“擎云生态”;Android11将强制应用使用内置相机| 极客头条...
- mysql connections
- ISA发布邮件服务器
- Zend Optimizer not installed可能原因及解决方法
- Zabbix钉钉机器人报警
- 2018 PKU_WC 长沙游 《我到长沙来看雪》
- 科技 计算机 事迹 大学,计算机学院
- 最新版Audition 2023(Au2023) win/mac音频编辑器
- 智慧公交解决方案-最新全套文件
- kfc扫描点餐系统java_Java实现KFC点餐系统过程解析
- cad角度命令怎么输入_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
- 【网络技术题库整理3】服务器和路由器技术
- 编程过程中常见的内存开辟和释放问题
- LeetCode存在重复 的五种解法
- 关于算法笔试的几个套路,一点就透
- android OS系统如何适配蓝牙遥控器