触屏操作的理解:

最基本的操作类型:

1.down:手指按下

2.move:手指在屏幕上移动

3.up:手指从屏幕上离开

操作原理:

现在流行的触屏手机的屏幕都是电容屏,它是通过人体微小电流和屏幕之间的电流交互来感知触屏的操作。

2.Android事件处理的三个重要函数

Android事件分发机制主要由“事件分发”—>“事件拦截”—>“事件响应”这三步来进行逻辑控制的。本文也将从这三步对应的函数来分析。

2.1 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。

  • return true : View消费所有事件。
  • return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
  • super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
2.2 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
  • return true: 对事件拦截,交由本层的onTouchEvent进行处理。
  • return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
  • super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
2.3 事件响应:public boolean onTouchEvent(MotionEvent ev)
  • return true: 表示onTouchEvent处理完事件后消费了此次事件。如果
  • return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
  • return: super.onTouchEvent,不响应事件,结果与return返回false一样。
  1. 点击事件的分发过程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法。从而也可以看出onTouch优先于onClick执行

android事件处理总体流程:

首先,Activity调用dispatchTouchEvent分发事件,将事件交给ViewGroup来处理,ViewGroup继续分发,同时也处理这个事件,如果事件处理返回true,就代表该事件被消费了,停止分发,反之,同理分发给View。当ViewGroup、View都没有消费时,就交给Activity消费。

如果onTouch()或者onTouchEvent()返回True,那么久会停止分发。

我们来看一下View中dispatchTouchEvent方法的源码:

[java] view plaincopy
  1. public boolean dispatchTouchEvent(MotionEvent event) {
  2. if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
  3. mOnTouchListener.onTouch(this, event)) {
  4. return true;
  5. }
  6. return onTouchEvent(event);
  7. }

首先是进行了一个判断,如果mOnTouchListener != null,(mViewFlags & ENABLED_MASK) == ENABLED和mOnTouchListener.onTouch(this, event)这三个条件都为真,就返回true,否则就去执行onTouchEvent(event)方法并返回。

先看一下第一个条件,mOnTouchListener这个变量是在哪里赋值的呢?我们寻找之后在View里发现了如下方法:

[java] view plaincopy
  1. public void setOnTouchListener(OnTouchListener l) {
  2. mOnTouchListener = l;
  3. }

Bingo!找到了,mOnTouchListener正是在setOnTouchListener方法里赋值的,也就是说只要我们给控件注册了touch事件,mOnTouchListener就一定被赋值了。

第二个条件(mViewFlags & ENABLED_MASK) == ENABLED是判断当前点击的控件是否是enable的,按钮默认都是enable的,因此这个条件恒定为true。

第三个条件就比较关键了,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch方法。也就是说如果我们在onTouch方法里返回true,就会让这三个条件全部成立,从而整个方法直接返回true。如果我们在onTouch方法里返回false,就会再去执行onTouchEvent(event)方法。

dispatchTouchEvent返回值是onTouchEvent()的返回值,一般而言,它在ondispatchEvent内部总是返回true(可能不希望在onTouch()中就停止对ACTION的传递吧)。dispatchTouchEvent内部中还有一个方法就是onTouch(),如果onTouch()返回true,那么就不会执行下面的onTouchEvent()。总而言之,要想onTouchEvent()能够执行,在onTouch()中就必须返回false;要想ACTION能够继续分发,就必须使dispatchTouchEvent()返回值为true。

dispatchTouchEvent返回值的意义跟onTouch返回值的区别,两者返回true的时候ACTION都会传递到ACTION_DOWN,其中onTouch返回true的时候由于不会执行到onTouchEvent所以不会执行到onClick,dispatchTouchEvent返回值为true对会不会执行onClick没有影响;onTouch返回false的时候执行onTouchEvent,如果此时该控件是可点击的就发执行onClick,而dispatchTouchEvent返回false就停止ACTION传递。

onTouchEvent的源码比复杂,在这里只强调一点,onClick方法在onTouchEvent方法内部,所以说onTouch>onTouchEvent>onClick。

结合上面所讲,如果onTouch返回true,onClick就不会再执行了。

KeyEvent

1.KeyEvent

int ACTION_DOWN = 0:标记down的常量

int ACTION_UO = 1:标记up的常量

int getAction:得到事件的类型

int getKeyCode():得到按键的keycode(唯一标志)

startTracking():追踪事件,用于长按监听

2.Activity

boolean dispatchKeyEvent(keyEvent event):分发事件

boolean onKeyDown(int keyCode,KeyEvent event):按下按键的回调

boolean onKeyUp(int keyCode,KeyEvent event):松开按键的回调

boolean onKeyLongPress(int keyCode,KeyEvent event):长按按键的回调

KeyEvent事件主要用途:比如点击返回按钮退出Activity(虽然这是系统已经实现好了的),然后实现OnKeyUp(),以实现在退出时,弹出一个对话框,提示是否退出。

更多精彩,请看:http://blog.csdn.net/guolin_blog/article/details/9097463

MotionEvent和KeyEvent机制相关推荐

  1. matlab edittext 回车,安卓中的虚拟键盘实现,KeyEvent的事件分发、处理机制。EditText是如何将KeyEvent事件转为字符输入的?...

    目录 一.实现一个可以模拟输入的软键盘 一开始,我们的需求是在用户经常使用的部分界面中,增加虚拟软键盘,减少用户对于外接键盘的依赖 如图,在整单改价界面右侧增加了方便用户快捷输入的软键盘,用户不需要使 ...

  2. 安卓中的虚拟键盘实现,KeyEvent的事件分发、处理机制。EditText是如何将KeyEvent事件转为字符输入的?

    目录 一.实现一个可以模拟输入的软键盘 二.问题:点击软键盘,没有任何反应,输入框没有填入字符 原因:传入小键盘键码,和大键盘键码,得到的结果不一致 三.为什么在前面经过测试的其他界面中,软键盘却又可 ...

  3. android touch事件坐标原点,图解Android:Touch事件传递机制

    前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...

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

    <div id="container">         <div id="header">     <div class=&qu ...

  5. Android触控基础:MotionEvent

    之前的文章层从Framework层介绍了Android Touch事件即(MotionEvent)的传递机制.本文将详细介绍MotionEvent的一些成员和方法.了解了MotionEvent对开发一 ...

  6. 一文读懂Android View事件分发机制

    Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...

  7. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  8. Android 4.0按键事件以及系统流程分析

    Android 4.0中按键的处理流程 按键在Android系统中,有着不同的代表意义.以前的全键盘的手机代码没有阅读过,所以也不是很了解.本人介绍的是在触摸屏的手机上的按键消息的处理流程. 在现在触 ...

  9. android double比较大小吗,Android双向选择控件DoubleSeekBar使用详解

    本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下 先看效果图 1.DoubleSlideSeekBar public class Doubl ...

最新文章

  1. 对于C#里面的this与base
  2. python 四种单例模式
  3. 微信公众号点击菜单即可打开并登录微站的实现方法
  4. java session丢失_跨域造成session丢失
  5. 【记录】在云服务器安装tomcat部署自己的项目 通过ip无需加端口号直接访问
  6. 虚函数和纯虚函数的区别?
  7. C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
  8. 面向对象的 XSLT编程
  9. Eclipse版本控制插件Subclipse与Subversive的区别与选择
  10. 散列表的开放定址法以及再散列法(C语言)
  11. 【ERROR】java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit
  12. 数据中心机房建设中的关键问题都有哪些?
  13. python时间序列因果检验_用python做时间序列预测8:Granger causality test(格兰杰因果检验)...
  14. IHS Markit:苹果16英寸MacBook Pro将采用英特尔第9代处理器
  15. 斯坦福21秋季:实用机器学习-李沐课程笔记
  16. UE4C++设置Actor与父Actor的相对位置和相对旋转
  17. DotNet 多线程下载
  18. 使用Unity3D50个技巧-50 Tips for Working with Unity (Best Practices)
  19. Winform中TopLevel与TopMost属性的区别
  20. 如何使用python编程抢京东优惠券 知乎_618!python京东 PC 版抢券程序

热门文章

  1. 最小误差阈值分割 matlab,原创:最小包容区域法处理圆度误差的程序算法
  2. 如何在没有软件的情况下将 PDF 转换为 PPT(100% 免费)
  3. 激光光束传输影响matlab仿真,matlab仿真光束的传输特性详解.doc
  4. 微信小程序遇到的问题
  5. repeater 控件ajax绑定数据源,【ASP.NET】第九课——使用DataList控件和Repeater控件绑定数据...
  6. CentOS换系统盘记录+home缩容过程
  7. 使用div和css重构网站,DIV+CSS网页重构概念详解
  8. PowerShell: 在自定义代码中支持Tab键自动补全
  9. 机器学习之决策树算法(1)
  10. ElasticSearch入门与Sense插件的使用