06_事件机制

Posted zhaye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06_事件机制相关的知识,希望对你有一定的参考价值。

理论概述

提出问题:

  android是如何响应对其中的某个视图的触控操作呢?

  Android是如何响应对手机的按键的操作呢? 

解决方案:

  MotionEvent机制(触屏)

  KeyEvent机制(按键)

MotionEvent(触屏操作)

触屏操作的理解

最基本的操作类型:

  down:手指按下

  move:手指在屏幕上移动

  up:手指从屏幕上离开

触屏操作的顺序:

  down->move->move->...->up

对屏幕的任何一个操作,系统都会创建一个MotionEvent对象来对应这个操作

相关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) : 处理事件的回调

3. View

  boolean dispatchTouchEvent(MotionEvent event) : 分发事件

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

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

  void setOnClickListener(OnClickListener l) : 设置点击监听

  void setOnLongClickListener(OnLongClickListener l) : 设置长按监听

  void setOnCreateContextMenuListener(OnCreateContextMenuListener l) : 用于创建菜单

4. ViewGroup

  boolean dispatchTouchEvent(MotionEvent ev) : 分发事件

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

触摸事件的分发与处理

  • 事件产生的顺序为: down-->move-->move...--->up
  • 事件对象被系统创建后, 首先会调用对应Activity对象的dispatchTouchEvent()进行分发
  • down在分发给视图对象的过程中要确定消费者(onTouchEvent()返回true),如果都返回false, 那事件的消费者只能是Activity了 后面的move和up事件, 将事件分发给消费者(可能是视图对象,也可能是Activity)处理, 如果视图不消费, 直接交给Activity处理消费
  • 每个事件都需要有一个消费者

KeyEvent(按键操作)

按键操作的理解

  • 操作的基本类型:
    •  down:手指按下
    •  up:手指从按键上离开
  • 按键操作的顺序: down->down->down->…--->up
  • 对按键的任何一个操作,系统都会创建一个KeyEvent对象来对应这个操作
  • 按键的长按监听:down之后一定时间还没有up时会触发长按监听回调

相关API

KeyEvent

  int ACTION_DOWN = 0 : 标识down的常量

  int ACTION_UP = 1 : 标识up的常量

  int getAction() : 得到事件类型

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

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

Activity

  boolean dispatchKeyEvent(KeyEvent event) : 分发事件

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

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

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

项目练习

功能描述:

  通过手指移动来拖动图片

  控制图片不能超出屏幕显示区域

技术点:

  MotionEvent处理

  对View进行动态定位(layout)

用到的View相关方法

int getLeft()

  得到当前视图左顶点相对父视图的X轴坐标

int getTop()

  得到当前视图左顶点相对父视图的Y轴坐标

int getRight()

  得到当前视图右下角点相对父视图的X轴坐标

int getBottom()

  得到当前视图右下角点相对父视图的Y轴坐标

layout(int left, int top, int right, int bottom) :

  动态指定当前视图在父视图中的定位, 参数为相对父视图的坐标

ViewParent getParent() :

  得到当前View的父视图对象

以上是关于06_事件机制的主要内容,如果未能解决你的问题,请参考以下文章

Android_基于监听的事件处理机制

python 模拟事件触发机制

进程之机制问题(锁,信号,事件)

画坦克__事件处理机制__2个监听

contiki-事件调度

180609-Spring之事件驱动机制的简单使用