美文网首页
Android触摸机制学习

Android触摸机制学习

作者: 咸鱼而已 | 来源:发表于2016-06-01 17:19 被阅读84次

    关于view的Touch事件、关于ViewGroup的touch事件

    View的触摸事件:

    dispatchTouchEvent、onTouchEvent、setOnTouchListener

    onTouch()和onTouchEvent的区别:

    • onTouch()是View提供给用户,让用户自己处理触摸事件的接口。而onTouchEvent()是Android系统自己实现的接口。
    • onTouch()的优先级比onTouchEvent()的优先级更高。dispatchTouchEvent()中分发事件的时候,会先将事件分配给onTouch()进行处理,然后才分配给onTouchEvent()进行处理。
    • 如果onTouch()对触摸事件进行了处理,并且返回true;那么,该触摸事件就不会分配在分配给onTouchEvent()进行处理了。只有当onTouch()没有处理,或者处理了但返回false时,才会分配给onTouchEvent()进行处理。

    传递流程:

    • Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
    • 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
    • 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
      好了,Android事件分发机制完全解析到此全部结束,结合上下两篇,相信大家对事件分发的理解已经非常深刻了。

    简单来说就是传递的时候用父视图往子视图传递,中间如果某一层视图的onInterceptTouchEvent返回true,那么就不会接着往下传递,然后开始响应流程,从子视图往父视图传递,如果中间某一层消费了这个事件,那么父视图就不会接收到这个事件。

    涉及到的API:

    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轴坐标(相对于屏幕左顶点)

    Activity

    • boolean dispatchTouchEvent(MotionEvent event) : 分发事件
    • boolean onTouchEvent(MotionEvent event) : 处理事件的回调

    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):用于创建菜单

    ViewGroup

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

    相关文章

      网友评论

          本文标题:Android触摸机制学习

          本文链接:https://www.haomeiwen.com/subject/okvhdttx.html