Android的事件机制

时间:2016年12月5日 9:53 点击:821次

一、理论概述

最基本的操作类型:

  • down 手指按下

  • move 手指在屏幕上移动

  • up 手指从屏幕上离开

触屏操作的顺序:down->move->move->…->up

对屏幕的任一操作,系统都会产生一个MotionEvent对象来对应这个对象。

注:点击和长按可以同时满足,如果只想满足长按,则让长按的监听返回true。点击和长按时可以move。

二、相关API

1、MotionEvent:触发事件

  • int ACTION_DOWN = 0 : 代表down

  • int ACTION_MOVE = 2 : 代表move

  • int ACTION_UP = 1 : 代表up

  • getAction() : 得到事件类型

  • getX() : 得到事件发生的X轴的坐标(相对于当前视图)

  • getRawX() : 得到事件发生的X轴的坐标(相对于屏幕左顶点)

  • getY() : 得到事件发生的Y轴的坐标(相对于当前视图)

  • getRawY() : 得到事件发生的Y轴的坐标(相对于屏幕左顶点)

2、Activity

  • boolean dispatchTouchEvent(MotionEvent event) : 分发事件

  • boolean onTouchEvent(MotionEvent event) : 处理事件的回调(当没有子View消费时才调用该方法)

3、View

  • boolean dispatchTouchEvent(MotionEvent event) : 分发事件(没有子view,用来决定是使用onTouchEvent还是setOnTouchListener)

  • boolean onTouchEvent(MotionEvent event) : 处理事件的回调方法

  • void setOnTouchListener(OnTouchListener listener) : 设置事件监听器

  • void setOnClickListener(OnClickListener l)

  • void setOnLongClickListener(OnClickListener l)

  • void setOnCreateContextMenuListener(OnCreateContextMenuListener l) 用于创建菜单监听

4、ViewGroup

  • boolean dispatchTouchEvent(MotionEvent event) : 分发事件

  • boolean onInterceptTouchEvent(MotionEvent event) : 拦截事件的回调方法

注:这里引入两个概念:处理和消费
只要调用了方法就叫做处理了;
只有返回了true才叫消费了;

事件对象被系统创建后,首先会调用对应Activity的dispatchTouchEvent()进行分发;

  • down在分发给视图对象的过程中要确定消费者(onTouchEvent()返回true),如果都返回false,那事件的消费者只能是activity了。

  • 后面的move和up都将分发给消费者(可能是视图对象,也可能是消费者)

  • 当前事件的消费者只是决定了下一个事件优先交给他处理

  • 每个事件都需要有一个消费者

例子:

MotionEventActivity.java

这里在右侧