zoukankan      html  css  js  c++  java
  • android中的事件传递机制

    android中的事件传递

    当手指触摸屏幕时,会触发一个touch事件,这个touch事件在android中是怎么传递的呢,下面就让我们来看一看

    (1)当一个touch事件来的时候,首先会传递给最顶层的view,有顶层的view,一级一级向下分发,知道找到点击的view,将这个消息传递给他

    事件分发时会调用dispatchTouchEvent(MotionEvent ev)这个方法.

    (2)顶层的view也可以选择不向下分发此事件,而是自己把这个事件给消耗了(这时会调用onInterceptTouchEvent(MotionEvent ev)方法,来消耗掉此事件),这样子view就不会收到这个touch事件,

    这时这个touch事件会交给顶层的onTouchEvent(MotionEvent event)执行

    (3)当事件传递给最终的子view时,子view返回true表示此事件已经处理完毕,不需要交给父view在进行处理,

      当子view返回false时,表示子view不处理这个事件,事件将会向上传递,交给父view进行处理,当父view全部返回false时,这个事件谁也不会处理

      这时,这个事件也只会传递给子view一次,下次不会在传递给子view了

    比如,写一个类继承自ViewGroup

    public class MyScrollPager extends ViewGroup{

     GestureDetector gestureDetector;//手势识别器
        private float firstX = 0;//初始x位置

      private float firstY = 0;//初始y位置
        //设置滑动监听
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            gestureDetector.onTouchEvent(event);
            
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                
                break;
            case MotionEvent.ACTION_UP:
                break;

            }
            return true;
        }

      /**
         * 事件的中断,true—>本层中断,不向下传递
         */
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            boolean bool = false;
            switch (ev.getAction()) {
            
            case MotionEvent.ACTION_DOWN:
                //当事件在这层中断掉以后,紧接着执行ontouchevent方法,
                //在ontouchevent方法中将收不到action_keydown消息,
                //因此手势识别器收不到key_down消息,因此会出现跳动现象
                gestureDetector.onTouchEvent(ev);
                firstX = ev.getX();
                firstY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float disx = Math.abs(ev.getX() - firstX);
                float disy = Math.abs(ev.getY()- firstY);
                //如果水平滑动的距离大于竖直滑动的距离
                //并且x轴防止抖动
                if(disx > disy && disx > 10){
                    bool = true;
                }else{
                    bool = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                
                break;

            default:
                break;
            }
            return bool;
        }

    }

    在这个方法中重写了onInterceptTouchEvent,onTouchEvent方法,

    这两个方法的意思是当手指左右滑动时,会中断此事件,当手指上下滑动时,

    会传递此事件,在onInterceptTouchEvent的action_down中,将此事件

    传递给了手势识别器,因为当onInterceptTouchEvent返回true时,会将此事件传递给自己的

    onTouchEvent进行处理,在onTouchEvent中收不到action_down消息,因此onInterceptTouchEvent

    中将event事件传递给手势识别器。

  • 相关阅读:
    20155210 实验4 恶意代码分析
    20155210 网络攻防技术 实验三 免杀原理与实践
    20155210 Exp2 后门原理与实践
    20155210 实验一 逆向与Bof基础
    2017-2018-1 20155210实验四 外设驱动程序设计
    20155208徐子涵课程设计个人总结
    课题设计个人总结
    第四周学习进展
    20155208徐子涵《网络对抗》Exp9 Web安全基础
    第三周任务总结
  • 原文地址:https://www.cnblogs.com/bxf123/p/5123810.html
Copyright © 2011-2022 走看看