事件分发机制解析(二)

(二)dispatchTouchEvent方法

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

(三)onTouchEvent方法

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

此处如果返回true时候,再dispatchTouchEvent方法中

if (!result && onTouchEvent(event)) {
                result = true;
}
return result ;

dispatchTouchEvent就返回true。

 private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,
            View child, int desiredPointerIdBits) {
        final boolean handled;

        // Canceling motions is a special case.  We don't need to perform any transformations
        // or filtering.  The important part is the action, not the contents.
        final int oldAction = event.getAction();
        if (cancel || oldAction == MotionEvent.ACTION_CANCEL) {
            event.setAction(MotionEvent.ACTION_CANCEL);
            if (child == null) {
                handled = super.dispatchTouchEvent(event);
            } else {
//此时返回true
                handled = child.dispatchTouchEvent(event);
            }
            event.setAction(oldAction);
            return handled;
        }

此时返回ViewGroup方法中,返回Handled。

//此处进入dispatchTransformedTouchEvent方法中,内部调用addTouchTarget,给touch做上标记
  if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {
                                // Child wants to receive touch within its bounds.
                                mLastTouchDownTime = ev.getDownTime();
                                if (preorderedList != null) {
                                    // childIndex points into presorted list, find original index
                                    for (int j = 0; j < childrenCount; j++) {
                                        if (children[childIndex] == mChildren[j]) {
                                            mLastTouchDownIndex = j;
                                            break;
                                        }
                                    }
                                } else {
                                    mLastTouchDownIndex = childIndex;
                                }
                                mLastTouchDownX = ev.getX();
                                mLastTouchDownY = ev.getY();
                                newTouchTarget = addTouchTarget(child, idBitsToAssign);
                                alreadyDispatchedToNewTouchTarget = true;
                                break;
                            }

此处break直接退出循环,其他子View不会获得event事件。

  private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits) {
        final TouchTarget target = TouchTarget.obtain(child, pointerIdBits);
        target.next = mFirstTouchTarget;
        mFirstTouchTarget = target;
        return target;
    }

此处进入addTouchTarget方法,进行标记。mFirstTouchTarget的传给touch的下一个引用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 台风来袭,雨很大,漏雨的地方依然漏,进雨的地方依然进,没再去关注 人生的风风雨雨如同这自然的台风暴雨,来你不可避免...
    舞动的月色阅读 789评论 0 1
  • 锦年,愿你能够展翅高飞 阿飞是个背包客,不是像我这样走走停停的短程 他在路上的时间已经两年了,走遍了大半个中国 ...
    WHITE_SHIRTS阅读 1,917评论 0 0
  • 开始得轰轰烈烈,事无巨细,结束得寥寥草草,漫不经心,为什么总是不能认认真真开始奋斗开始努力呢?心思太多,没用的琐碎...
    好人乔阅读 3,290评论 0 0
  • 窗外的蝉鸣 像断了弦的琴声 筛落了一地 斑驳的树影 阳光爬上窗台 喘着粗气 躺下来 晾晒被淋了一夏的心情 天空变得...
    子莯青青阅读 2,523评论 0 2
  • 001 对战术战略的理解,战术是方式方法,战略是目标方向;战术是局部区域,战略是全面全域;战术是点,战略是面。 0...
    开心蜜雪儿阅读 3,290评论 0 0