View的事件处理机制笔记

View的事件处理机制:

首先得明白onTouch()和OnTouchEvent()有什么区别?
不管是什么控件都有dispatchTouchEvent()方法,当我们点击屏幕首先调用的也是这个方法。

那么,看看dispatchTouchEvent()方法的一段源码:

这就说明:
1.在dispatchTouchEvent()中,如果返回true,执行onTouch()方法;否则才执行onTouchEvent()方法,
也就是说,onTouch()优先于onTouchEvent()执行.

分别看看看按下ImageView和Button时onTouch()响应的次数:


2.当我们分别点击iv和button,通过打印出来的结果知道,点击事件是在onTouchEvent()里面执行的。
onTouch()返回true时控件响应2次,否则响应1次.
当给View控件设置点击事件后,所有控件都相应2次.

Button也不例外,因为系统默认给Button返回了一个true

以下是粗略的源码分析:
View上setOnTouchListener方法
public void setOnTouchListener(OnTouchListener l) {
mOnTouchListener = l;
}

iamgeView调用view上面setOnTouchListener方法,并且将指定对象传递进去
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//返回true,导致事件全部被响应
return false;
}
});

mOnTouchListener从何处获取??
public boolean dispatchTouchEvent(MotionEvent event) {
....
//mOnTouchListener不为空,并且当前控件可用,onTouch方法对应得返回值
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
//如果if对于逻辑不成立,调用onTouchEvent
//onTouch先于onTouchEvent,并且觉得当前onTouchEvent是否调用
return onTouchEvent(event);
}

public boolean onTouchEvent(MotionEvent event) {
....
//判断当前控件是否有点击事件,如果有则执行if中逻辑,如果没有则不执行返回false
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
//点击事件触发点
case MotionEvent.ACTION_UP:
...
performClick();
...
}
//此处返回true则说明onTouchEvent,说明dispatchTouchEvent返回true,则响应所有事件
return true;
}
//此处返回false,等同于onTouchEvent,dispatchTouchEvent返回false,不响应所有事件
return false;
}

//view中setOnClickListener方法
public void setOnClickListener(OnClickListener l) {
//如果当前控件没有点击事件,设置一个点击事件
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
//给指定的iamgeView去设置一个点击事件,去掉用view上setOnClickListener方法
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...
}
});

//点击事件的处理规则,mOnClickListener什么时候传递进来的??
public boolean performClick() {
...
if (mOnClickListener != null) {
....
mOnClickListener.onClick(this);
...
}
...
}

时间: 2024-08-04 18:15:58

View的事件处理机制笔记的相关文章

Android中的事件分发机制(下)——View的事件处理

综述 在上篇文章Android中的事件分发机制(上)--ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析.在文章的最后ViewGroup的dispatchTouchEvent方法调用dispatchTransformedTouchEvent方法成功将事件传递给ViewGroup的子View.并交由子View进行处理.那么现在就来分析一下子View接收到事件以后是如何处理的. View的事件处理 对于这里描述的View,它是ViewGroup的父类,并不包含任何的子元

Cocos2d-x学习笔记—事件处理机制

Cocos2d-x学习笔记-事件处理机制 一:事件处理机制 一个事件由触发到完成响应,主要由以下三部分组成: 事件分发器EventDispatcher: 事件类型EventTouch.EventKeyboard等: 事件监听器EventListenerTouch.EventListenerKeyboard等. 在Cocos2d-x v3.x中,关于事件的东西,无非就是围绕上述的三个部分展开来的,掌握了上述的三个部分,也就掌握了Cocos2d-x v3.x中事件处理的精髓. (1)事件分发器: 事

View机制深入学习(五) 事件处理机制一

以TouchEvent为主,看一下View和ViewGroup内部是如何处理Input Events的: 首先来看事件的产生来源: 一.获取事件: 事件的来源可以分为"软件","硬件"两种: 主要的事件包含有: 按键事件(KeyEvent) :即物理按键按下产生的事件,相关的常用物理按键一般有HOME,BACK等 触摸事件(TouchEvent): 鼠标事件(MouseEvent).轨迹球事件(TrackBallEvent)(这两个已经不常见): 针对所有事件的共性

Android基础入门教程——3.2 基于回调的事件处理机制

Android基础入门教程--3.2 基于回调的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言 在3.1中我们对Android中的一个事件处理机制--基于监听的事件处理机制进行了学习,简单的说就是 为我们的事件源(组件)添加一个监听器,然后当用户触发了事件后,交给监听器去处理,根据不同的事件 执行不同的操作;那么基于回调的事件处理机制又是什么样的原理呢?好吧,还有一个问题:你知道 什么是方法回调吗?知道吗?相信很多朋友都是了解,但又说不出来吧!好了,带着这些疑问我们 对a

Android的Touch事件处理机制

Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一下Touch事件处理的几条基本规则. 1.如果在某个层级没有处理ACTION_DOWN事件,那么该层就再也收不到后续的Touch事件了直到下一次ACTION_DOWN事件. 说明:a.某个层级没有处理某个事件指的是它以及它的子View都没有处理该事件. b.这条规则不适用于Activity层(它是顶

Android基础入门教程——3.1 基于监听的事件处理机制

Android基础入门教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言: 第二章我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已:下一步就要开始学习逻辑与业务实现了,本章节讲解的是Android的事件处理机制!何为事件处理机制?举个 简单的例子,比如点击一个按钮,我们向服务器发送登陆请求!当然,Android中的事件处理机制不止这一种, 比如屏幕发生选择,我们点击了屏幕上某个区域-简单点说,事件处

理解Android事件处理机制

Android的事件处理机制分为两大类:基于监听器和基于回调 1.基于监听器的事件处理 这种处理方式和Java的GUI组件监听器的几乎一样,是一种委托式的处理办法.即如果View组件(事件源)被单击或者长按(事件)后,系统将这个单击事件委托给特定对象(监听器)处理,特定对象可以是Listener对象也可以是组件指定的事件处理方法.这里涉及到三个成员:事件源,事件和监听器.其中监听器是核心,它包含了事件的处理的实现. 下面是一个简单的Button监听器,采用匿名内部类的实现形式.界面布局文件只是线

《转之微信移动团队微信公众号》iOS 事件处理机制与图像渲染过程

致歉声明: Peter在开发公众号功能时触发了一个bug,导致群发错误.对此我们深表歉意,并果断开除了Peter.以下交回给正文时间: iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什

iOS 事件处理机制与图像渲染过程

iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什么 RunLoop是一个接收处理异步消息事件的循环,一个循环中:等待事件发生,然后将这个事件送到能处理它的地方. 如图1-1所示,描述了