• 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的父视图对象

  • 相关阅读:
    VIJOS P1057盖房子 (动态规划)
    RQNOJ PID57 / 找啊找啊找GF
    RQNOJ PID302 / [NOIP2001]统计单词个数 (动态规划)
    hdu 3829 Cat VS Dog 最大独立集
    并查集 找k颗树使节点数最多
    在 Sublime Text 3 中配置编译和运行 Java 程序
    在 Sublime Text 3 中配置编译和运行 Java 程序
    StarUML license key
    StarUML license key
    测试对于list的sort与sorted的效率
  • 原文地址:https://www.cnblogs.com/zhaye/p/10930656.html
Copyright © 2020-2023  润新知