zoukankan      html  css  js  c++  java
  • 事件传递机制总结

    事件系统组成元素:

    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

  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748290.html
Copyright © 2011-2022 走看看