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事件传递给手势识别器。

  • 相关阅读:
    12-factor应用和微服务架构应用的区别
    SAP云平台里Global Account和Sub Account的关系
    SAP成都研究院李三郎:SCP Application Router简介
    介绍两个好玩的和Github相关的Chrome扩展
    Java,JavaScript和ABAP通过代码取得当前代码的调用栈Callstack
    SAP CRM和C4C的内容管理(Content Management)
    CRM WebClient UI的浏览器打印实现
    通过ABAP代码判断当前系统类型,BYD还是S4 OP还是S4 Cloud
    使用ABAP批量下载Markdown源文件里的图片到本地
    ABAP下载的病毒扫描Virus Scan
  • 原文地址:https://www.cnblogs.com/bxf123/p/5123810.html
Copyright © 2011-2022 走看看