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

  • 相关阅读:
    .Net和SqlServer的事务处理实例
    SQL Server-- 存储过程中错误处理
    Asp.Net中使用Newtonsoft.Json转换,读取,写入
    从客户端中检测到有潜在危险的 Request.Form 值
    -Json与Xml之间的转换
    c#操作xml的代码(插入节点、修改节点、删除节点等)
    重置SQL Server sa密码
    用exec调用带有output输出参数的存储过程
    日期获取 net
    PhoneListenerService
  • 原文地址:https://www.cnblogs.com/bxf123/p/5123810.html
Copyright © 2011-2022 走看看