美文网首页
Android onTouchEvent的一些事

Android onTouchEvent的一些事

作者: 那落_ | 来源:发表于2017-05-12 15:06 被阅读0次

    dispatchTouchEvent

    作用是:事件分发。
    return true:只执行当前方法。
    return false:传递到父控件的onTouchEvent()
    return super.dispatchTouchEvent(ev): 1.无子类的view:传递到当前控件的onTouchEvent();2.有子类的view:传递到当前控件的onInterceptTouchEvent()

    可以在这里调用requestDisallowInterceptTouchEvent()方法来请求父控件的拦截事件

    eg1:

     /**
    
     * 事件分发, 请求父控件及祖宗控件是否拦截事件
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (getCurrentItem() != 0) {
            getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,
                                                                    // 不拦截
        } else {// 如果是第一个页面, 请求父控件拦截
            getParent().requestDisallowInterceptTouchEvent(false);// 拦截
        }
        return super.dispatchTouchEvent(ev);
    }
    

    eg2:
    /**
    * 事件分发, 请求父控件及祖宗控件是否拦截事件 1. 右划, 而且是第一个页面, 需要父控件拦截 2. 左划, 而且是最后一个页面, 需要父控件拦截
    * 3. 上下滑动, 需要父控件拦截
    */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
    getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,
    // 这样是为了保证ACTION_MOVE调用
    startX = (int) ev.getRawX();
    startY = (int) ev.getRawY();
    break;
    case MotionEvent.ACTION_MOVE:

            int endX = (int) ev.getRawX();
            int endY = (int) ev.getRawY();
    
            if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
                if (endX > startX) {// 右划
                    if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                } else {// 左划
                    if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
                                                                            // 需要拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                }
            } else {// 上下滑动
                getParent().requestDisallowInterceptTouchEvent(false);
            }
    
            break;
    
        default:
            break;
        }
    
        return super.dispatchTouchEvent(ev);
    }
    

    onInterceptTouchEvent

    作用:其方法作用是自身控件是否对事件的消费;判断是否传递给子控件。注意,无子类view没有此方法,
    return true:一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),时把事件传递给当前的控件的onTouchEvent()处理;
    return false:返回false,则把事件交给子控件的onInterceptTouchEvent(),传递到子控件的dispatchTouchEvent()
    调用顺序是:viewgroup.onInterceptTouchEvent->view.onInterceptTouchEvent,自上往下

    onTouchEvent

    作用:onTouchEvent是在view中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四种事件。
    return true:消费当前事件。
    return false:false是不消费,则向上传递给父控件的onTouchEvent;
    调用顺序是:view.onTouchEvent->viewgroup.onTouchEvent,自下往上
    另外再讲讲onTouchListener的onTouch方法

    onTouch

    onTouch方法是View的 OnTouchListener借口中定义的方法。
    当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。(当把手放到View上后,onTouch方法被一遍一遍地被调用)
    onTouch优先级比onTouchEvent高,会先触发。
    return false: onTouchEvent()是触发的上一层activity或者外层viewGroup的onTouchEvent(),而不是当前view的OnTouchEvent();
    return true: 内置诸如click事件的实现等等都基于onTouchEvent,这些事件将不会被触发。

    相关文章

      网友评论

          本文标题:Android onTouchEvent的一些事

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