下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

安卓开发面面观之Touch事件原理分析

作者:课课家     来源: http://www.kokojia.com点击数:1253发布时间: 2019-03-17 14:53:34

标签: 移动开发androidTouch事件原理

  众所周知在Android中有各种各样的事件来响应用户的操作,通常这些事件可以分为按键事件和触屏事件,而其中的Touch事件是触屏事件的基础事件。由于在进行Android开发时经常会用到,所以理解它的原理机制便成为移动开发者们学习的必要过程。本次的讲解课课家笔者就主要给大家分析android开发中Touch事件的原理,让大家对此有一个比较基本的了解。

安卓开发面面观之Touch事件原理分析_移动开发_android_Touch事件原理_课课家

  我们知道Android系统中的每个View的子类都具有下面三个和Touch Event处理密切相关的方法:

  ①public boolean dispatchTouchEvent(Motion Event ev)用来分发Touch Event

  ②public boolean onInterceptTouchEvent(Motion Event ev)用来拦截Touch Event

  ③public boolean onTouchEvent(Motion Event ev)用来处理Touch Event

  尽管已知道上面3个处理方法,笔者相信大家在进行android开发的过程中也会遇到过这样一个疑问,当屏幕中包含一个View Group,而这个View Group又包含一个子view时,到底是View Group来处理Touch事件,还是子view来处理Touch事件呢?

  其实当Touch Event发生时,Activity首先会将Touch Event传递给最顶层的View,TouchEvent最先到达最顶层view的dispatch Touch Event,然后由dispatch Touch Event方法进行分发。

  ①若是dispatch TouchEvent返回true,则交给这个view的on Touch Event来进行处理。

  ②若是dispatch TouchEvent返回false,则交给这个view的intercept Touch Event来决定是否要拦截这个事件。

  ③若是intercept TouchEvent返回true,换句话说就是拦截掉了,则交给它的on Touch Event来进行处理。

  ④若是intercept TouchEvent返回false,那么接下来就传递给子view,由子view的dispatch Touch Event再来开始这个事件的分发。

  ⑤若是事件传递到某一层的子view的on Touch Event上了,这个方法返回了false,那么这个事件会从这个view往上传递,都是on Touch Event来接收。

  ⑥若是传递到最上面的on Touch Event也返回false的话,这个事件就会“消失”且接收不到下一次事件。

  为了让大家有一个更直观的了解,下面笔者用代码例子来给大家来具体说明:

  layout配置文件main.XML:

layout配置文件main.XML

  通过观察我们发现节点层次比较简单,一个Linear Layout中添加了一个Text View。下面是具体的java代码例子:

LinearLayout中添加了一个TextView

LinearLayout中添加了一个TextView

LinearLayout中添加了一个TextView

LinearLayout中添加了一个TextView

LinearLayout中添加了一个TextView

  为了指代方便下面笔者将My Linear Layout简称为L,将My Text View简称为T,L.on Intercept Touch Event=true表示的含义为My Linear Layout中的on Intercept Touch Event方法返回值为true,通过程序运行时输出的Log来说明调用时序,具体共分为以下四种情况。

  ● ①L.onInterceptTouchEvent=false&&L.onTouchEvent=true&&T.onTouchEvent=true输出下面的Log:

  D/My Linear Layout(11865): dispatch Touch Event action:ACTION_DOWN
  D/My Linear Layout(11865): on Intercept Touch Event action:ACTION_DOWN
  D/My Text View(11865): dispatch Touch Event action:ACTION_DOWN
  D/My Text View(11865): ---on Touch Event action:ACTION_DOWN
  D/My Linear Layout(11865): dispatch Touch Event action:ACTION_MOVE
  D/My Linear Layout(11865): on Intercept Touch Event action:ACTION_MOVE
  D/My Text View(11865): dispatch Touch Event action:ACTION_MOVE
  D/My Text View(11865): ---on Touch Event action:ACTION_MOVE
  ...........省略其他的ACTION_MOVE事件Log
  D/My Linear Layout(11865): dispatch Touch Event action:ACTION_UP
  D/My Linear Layout(11865): on Intercept Touch Event action:ACTION_UP
  D/My Text View(11865): dispatch Touch Event action:ACTION_UP
  D/My Text View(11865): ---on Touch Event action:ACTION_UP

  总结:Touch Event完全由Text View处理。

  ● ②L.on Intercept Touch Event=false&&L.on Touch Event=true&&T.on Touch Event=false输出下面的Log:

  D/My Linear Layout(13101): dispatch Touch Event action:ACTION_DOWN
  D/My Linear Layout(13101): on Intercept Touch Event action:ACTION_DOWN
  D/My Text View(13101): dispatch Touch Event action:ACTION_DOWN
  D/My Text View(13101): ---on Touch Event action:ACTION_DOWN
  D/My Linear Layout(13101): ---on Touch Event action:ACTION_DOWN
  D/My Linear Layout(13101): dispatch Touch Event action:ACTION_MOVE
  D/My Linear Layout(13101): ---on Touch Event action:ACTION_MOVE
  ...........省略其他的ACTION_MOVE事件Log
  D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_UP
  D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_UP

  总结:Text View只处理了ACTION_DOWN事件,Linear Layout处理了所有的Touch Event。

  ● ③L.on Intercept Touch Event=true&&L.on Touch Event=true输出下面的Log:

  D/My Linear Layout(13334): dispatch Touch Event action:ACTION_DOWN
  D/My Linear Layout(13334): on Intercept Touch Event action:ACTION_DOWN
  D/My Linear Layout(13334): ---on Touch Event action:ACTION_DOWN
  D/My Linear Layout(13334): dispatch Touch Event action:ACTION_MOVE
  D/My Linear Layout(13334): ---on Touch Event action:ACTION_MOVE
  ...........省略其他的ACTION_MOVE事件Log
  D/My Linear Layout(13334): dispatch Touch Event action:ACTION_UP
  D/My Linear Layout(13334): ---on Touch Event action:ACTION_UP

  总结:Linear Layout处理了所有的Touch Event。

  ● ④L.on Intercept Touch Event=true&&L.on Touch Event=false输出下面的Log:

  D/My Linear Layout(13452):dispatch Touch Event action:ACTION_DOWN

  D/My Linear Layout(13452):on Intercep tTouch Event action:ACTION_DOWN

  D/My Linear Layout(13452):---on Touch Event action:ACTION_DOWN

  总结:Linear Layout只处理了ACTION_DOWN事件,而其他的Touch Event则是被Linear Layout最外层的Activity处理了Touch Event。

  以上就是安卓中Touch事件原理的分析。

  本次安卓开发面面观之Touch事件原理分析的讲解到此就暂告一段落,若是以后有什么相关的内容进行补充或者修改的话,笔者会继续在此进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习移动开发能够起到一定的帮助作用!

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程