概述:

在任何开发的过程当中,都会存在各种Bug需要不断的调试去解决。而在Android中,自然也少不了各种蛋疼的“福利”,而在其中,触摸机制绝对是一块难啃的骨头。前段时间也一直说要写写关于这方面的文章,却迟迟没有下笔,今天抽空将自己平时的想法整理成文吧。有任何问题欢迎拍砖。

另外,平常虽然喜欢以代码来说明问题和内容,但是触摸机制,个人认为必须先理清思路再去理解代码,再理清思路,会使得整个理解过程更加的透彻和明了。

触摸机制的基础:

Android的视图类View都支持事件触摸机制。你可以在你的基础控件或者你的Activities中对触摸事件做出一定的反应。安卓支持多点触摸,比如将你的几个手指和屏幕进行接触,同样可以对其进行一定的控制。

而触摸机制的基础类是MotionEvent,而该类通过onTouchEvent方法将事件传递到视图中。如果你想要对触摸事件做出反馈,也就是交互,那么你需要重写OnTouchEvent方法。而在MotionEvent类中包含了与触摸相关的一些信息参数,比如触摸的点的数量、x/y的坐标值和大小以及每个点的压力值。并且如果该方法返回true的话,那么这次触摸时间就被消费掉了

触摸机制的过程:

Android系统会找到最里面的一个返回true的试图来处理这次的触摸事件。如果这个视图是另外一个试图(父视图)的一部分,那么父视图可以通过oninterceptTouchEvent方法返回true来消费掉这次的触摸事件。而该操作将会给上一个收到该事件的试图一个MotionEvent.ACTION_CANCEL的事件信息。

如何触发该机制:

在一个Activity中与触摸事件进行交互,只要在相关的视图中注册一个事件触摸监听器(onTouchListener)就可以了。另外一种方法是自定义控件中复写onTouchEvent()方法,来进行具体的触摸事件反应。

看完上面几段话一定会很糊涂,什么是OnInterceptionTouchEvent?什么是onTouchEvent?还有一个dispatchTouchEvent是什么呢?
其实在android中的View的子类都具有这三个方法,换言之,只要你是视图类,那么你就可以复写这三个方法,从而达到自己的目的,因为这三个方法和触摸机制密切相关。

1)boolean dispatchTouchEvent
从字面意思着手,可以猜到它是用来分发TouchEvent事件的,可以理解为快递员分发快递。
2)boolean oninterceptTouchEvent
intercept打断的意思,那么可知这个方法是用来拦截TouchEvent,比如某个用户突然不想发送快递了,那么赶紧拦截吧。
3)boolean onTouchEvent
这个就好理解了,就是对TouchEvent触摸事件的处理,比如这个快件是送到上海的还是送到北京的。具体的处理内容全都在这个方法中。

其实掌握了这三个方法,那么你就掌握了触摸机制的一半了,但是这三个方法却不是那么好掌握和理解的。

当TouchEvent发生的时候,整个触摸传递的过程,就是上述三个方法的不断交替和选择。首先当你的手指触摸到屏幕的时候,Activity将TouchEvent传递给最顶层的View,那么这时候上面三个方法将会决定他的走向.如果dispatchTouchEvent返回true,那么很简单,这个最顶层的View将会触发onTouchEvent方法对该触摸事件进行处理。如果返回的是false,那么首先他将传递给这个View的interceptTouchEvent方法来决定是否要拦截这个事件,如果拦截也就是返回true,那么将依旧交给他的onTouchEvent来处理;相反,如果返回的是false那么将会继续传递给他的子View,依此类推进行传递。如果时间传递到某一层的子View的onTouchEvent上并且返回的是false,那么这个时间将不会继续往下传递,而是往外传递,并且都是由onTouchEvnet来接受。直到某个View返回True消费掉,或者一直返回false,直到这次事件永远消失。

OK,第一篇不以代码明示,第二篇将以代码验证上述过程和具体的实现原理。

原文地址,也就是本文我的首发地址:http://jackyonline.org/archives/816

更多相关文章

  1. Android触摸反馈(回顾整理):触摸事件的分发机制、拦截机制。
  2. android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
  3. 基于android的网络音乐播放器-本地音乐的加载和后台播放(一)
  4. 【Android归纳决】回调机制在Android中的应用与实战
  5. Android拍照或从系统相册获取图片
  6. 备战面试旺季:三年开发经验,离开了某创业公司我用这些拿到了6个大
  7. 【Android】蓝牙开发——经典蓝牙:配对与解除配对 & 实现配对或连
  8. Android适配器进阶之三(抽象分类适配器)
  9. Qt on Android(安卓)实现App普通全屏、沉浸模式、粘性沉浸模式

随机推荐

  1. 我的跳槽经历
  2. 图形布局和实际设备上的布局不同
  3. android里通过什么什么事件可以拿到由于c
  4. Android 修改spinner 字体颜色 样式的方
  5. Android SQLite的数据库文件存储在SD卡中
  6. 当在调试模式下启动时,Android应用程序崩
  7. 如何将Maven添加到现有的IntelliJ Androi
  8. 超简单方式教你打造原生侧滑菜单
  9. Android NDK R9 安装配置 无需Cygwin
  10. Android 4.4源码下载与编译