事件传递机制总结

来源:互联网 发布:js注释方式 编辑:程序博客网 时间:2024/05/17 06:48

事件系统组成元素:

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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机想让它横屏怎么办 教孩子写作业头都被气炸了怎么办 2岁宝宝大小脸怎么办 宝宝2岁半不认识颜色怎么办 宝宝11个多月突然排斥妈妈怎么办 5个月婴儿粘妈妈怎么办 3岁宝宝记不住颜色怎么办 3岁宝宝不认字怎么办 墙纸被宝宝弄上各种颜色怎么办 三周半的孩子不认识数字怎么办 3岁幼儿不会数数怎么办 四岁宝宝不认识数字怎么办 三岁宝宝不认识数字怎么办 4岁半了不认识数字怎么办 5岁小朋友数字不认识怎么办 孩子读一年级字都不识几个怎么办 宝宝二周多了不分颜色怎么办 4岁儿童手指脱皮怎么办 孩子老是不会写2怎么办 宝宝胃浅容易吐怎么办 农村户口小孩去城里读书怎么办 小孩从城市回农村读书怎么办 天冷了怎么办教案反思 小孩上幼儿园不爱学习怎么办 曰光灯管监控要反光怎么办 立邦乳胶漆墙面脏了怎么办 橱柜门黑色边颜色花了怎么办 地板上有真实漆怎么办 吸了泡泡球的气怎么办 办公室上班坐着太累怎么办 金雀盆景生虫怎么办 租的房子墙脏怎么办 租住个厕所对着卧室怎么办 农村的房子没有房产证怎么办 墙面漆颜色深了怎么办 浴室门对卧室门怎么办 卧室40多个平方太大怎么办 卧室门洞太窄了怎么办 刷漆的墙面脏了怎么办 卧室颜色刷重了怎么办 感觉房子买小了怎么办