• 事件传递机制总结


    事件系统组成元素:

    1. 每个事件被包装为一个MotionEvent

    2. 描写叙述一个事件的位置(location)

        --ACTION_DOWN

        --ACTION_UP

        --ACTION_MOVE

        --ACTION_POINTER_DOWN

        --ACTION_POINTER_UP

        --ACTION_CANCEL

    3.事件的元数据包含

        --事件的位置(location)

        --第几个手指(多点触摸事件)

        --事件发生的时间

    4.触摸事件開始于ACTION_DOWN结束于ACTION_UP

     

    事件传递系统:

    (1) 事件从Activity.dispatchTouchEvent()開始传递,仅仅要没有被停止或拦截。从最上层的View(ViewGroup)開始一直往下(子View)传递。

    子View能够通过onTouchEvent()对事件进行处理。

    (2) 事件由父View(ViewGroup)传递给子View,ViewGroup能够通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

    (3) 假设事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递。这时父View(ViewGroup)能够进行消费。假设还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

    (4) 假设View没有对ACTION_DOWN进行消息。之后的其它事件不会传递过来。

    (5) OnTouchListener.onTouch()优先于onTouchEvent()对事件进行消费。

     

    自己定义View事件处理注意事项;

    1. 处理事件

           --@override  onTouchEvent()方法

           --提供一个OnTouchlistener

    2. 消费事件

           -- 返回TRUEwith ACTION_DOWN表示消费了该事件

            -- 其它事件返回TRUE不过阻止兴许action事件传递

    3. ViewConfiguration类中一些有关的方法

     (ViewConfigurationconfiguration = ViewConfiguration.get(context);获得一个ViewConfiguration对象)

            --getScaledTouchSlop() 获得可以进行手势滑动的最短距离.假设小于这个距离就不触发移动控件事件.

            --getScaledMinimumFlingVelocity()获得同意运行一个Fling手势动作的最小速度值

            --getLongPressTimeout()是用于检測是不是长按的时间,默觉得500毫秒

    4.调用dispatchTouchEvent()方法避免直接调用onTouchEvent()

    5.假设是ViewGroup能够拦截事件

     

    TouchDelegate委派处理View事件

    实例:

    1.设定一个长方形区域

    Rect bounds = newRect(0, 0, getMeasuredWidth(), getMeasuredHeight());

    2.设置长方形为点击生效区域,委派处理点击事件的View

    TouchDelegatedelegate = new TouchDelegate(bounds, mButton);

    setTouchDelegate(delegate);

     

     

    多指触摸事件处理

         --MotionEvent.getPointerCount()得到眼下屏幕上的触点数(ACTION_MOVE)

         --使用ACTION_POINTER_DOWN和ACTION_POINTER_UP来监听多点触控操作。多点触控实用的方法。这两个事件须要结合MotionEvent.getActionMasked(),MotionEvent.getActionIndex()两个方法来处理.

    getActionMasked()表示能够获取用于多点触控检測点的事件。而在1.62.1中并没有event.getActionMasked()这种方法,事实上他就是把event.getAction()&MotionEvent.ACTION_MASK封装了一下。

    getActionIndex().获取多点事件中的索引,即表示是哪一个手指触发的事件

    很多其它介绍见:

    http://developer.android.com/reference/android/view/MotionEvent.html

    http://stackoverflow.com/questions/13546376/how-to-use-multitouch-properly-purpose-of-motionevent-getactionindex
  • 相关阅读:
    ABP实现文件下载
    sqlserver把查询结果转为json和xml
    使用docker安装nginx
    sqlserver 索引优化 sql语句执行分析
    centos7下安装docker教程
    mysql查看sql的执行计划(是否使用索引等)
    vue计算属性和watch的区别有哪些?
    多表连接的三种方式详解 hash join、merge join、 nested loop
    【Winform】所有的dll都打包到一个exe里
    【异常处理】System.Data.Entity.Core.EntityException: 'The underlying provider failed on Open.'
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7106546.html
Copyright © 2020-2023  润新知