Android View、ViewGroup 事件分发机制(一)

原创 2014年09月11日 17:13:54

View事件分发涉及的方法:onTouch、dispatchTouchEvent、onTouchEvent 。

ViewGroup事件分发涉及的方法:onTouch、dispatchTouchEvent、onTouchEvent 、onInterceptTouchEvent。

1. Button点击事件响应流程

点击Button --> 调用Button的dispatchTouchEvent -->调用TextView的dispatchTouchEvent方法

--> 调用View的dispatchTouchEvent方法,我们来看下View的dispatchTouchEvent方法内部

public boolean dispatchTouchEvent(MotionEvent event) {
        if (!onFilterTouchEventForSecurity(event)) {
            return false;
        }
        // 1. 设置过监听,2.按钮是ENABLED(默认为true) 3.onTouch方法返回true
        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) {
            return true;
        }
        return onTouchEvent(event);
    }

第一种情况:当1和2为真的时候,才会执行3,当3中onTouch方法返回true的时候,dispatchTouchEvent返回true,

也就标志着此事件被消耗。

 第二种情况:当1和2为真的时候,才会执行3,当3中onTouch方法返回false的时候,调用onTouchEvent方法,

下面我们看看这个方法内部。

public boolean onTouchEvent(MotionEvent event) {
        final int viewFlags = mViewFlags;
        if ((viewFlags & ENABLED_MASK) == DISABLED) {
            return (((viewFlags & CLICKABLE) == CLICKABLE ||(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
        }
        if (mTouchDelegate != null) {
            if (mTouchDelegate.onTouchEvent(event)) {
                return true;
            }
        }
	// 判断View是否是可点击的,如果可点击则UP之后会执行到performClick方法,此方法中会调用onClick方法处理相应逻辑,并返回true
	// 如果不是可点击的,则始终会返回false
        if (((viewFlags & CLICKABLE) == CLICKABLE ||(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    boolean prepressed = (mPrivateFlags & PREPRESSED) != 0;
                    if ((mPrivateFlags & PRESSED) != 0 || prepressed) {
                        boolean focusTaken = false;
                        if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
                            focusTaken = requestFocus();
                        }
                        if (!mHasPerformedLongPress) {
                            removeLongPressCallback();
                            if (!focusTaken) {
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClick();
                                }
                            }
                        }
                    }
                    break;
                case MotionEvent.ACTION_DOWN:
					...
                    break;
					...
                case MotionEvent.ACTION_CANCEL:
                    break;
					...
                case MotionEvent.ACTION_MOVE:
                    break;
            }
            return true;
        }
        return false;
    }
下面我们简单的看一下performClick这个方法吧

 public boolean performClick() {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        if (mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
	    //执行点击事件业务逻辑,并返回true消费此事件
            mOnClickListener.onClick(this);
            return true;
        }
        return false;
    }

2. ImageView点击事件响应流程

ImageView和Button的区别是:ImageView默认是不可点击的,也就是说如果执行到onTouchEvent方法,此方法会一直返回false,也就是dispatchTouchEvent方法返回false,此事件就不会被消耗就只会执行一次ActionDown操作.

当然,如果想对ImageView添加点击事件,可以设置它的clickable属性。

注意:官方文档对dispatchTouchEvent的返回值的解释是:True if the event was handled by the view, false otherwise。

我们可以简单的理解为如果返回true,就说明它需要处理这个事件,就让它接收所有的触屏事件,否则,说明它不用处理,也就不让它接收后续的触屏事件了。

如果你感兴趣,请继续阅读《Android View、ViewGroup 事件分发机制(二)》


Demo下载请猛戳

Android View和ViewGroup事件分发机制源码分析

从 view和viewGroup源码去深入了解事件分发机制。 梳理整个事件分发、拦截和响应的处理过程。...
  • Amazing7
  • Amazing7
  • 2016年04月28日 16:52
  • 14462

Android事件分发机制(ViewGroup篇)

上一篇 我们介绍了View的事件分发机制,不熟悉的可以先了解一下上一篇:Android事件分发机制(View篇)引言本篇我们接着上一篇,来继续学习一下Android ViewGroup的事件分发机制....

Android View框架总结(八)ViewGroup事件分发机制

请尊重分享成果,转载请注明出处:  http://blog.csdn.net/hejjunlin/article/details/52298780 上篇分析了View的事件分发流程,留了一个问...

Android6.0 ViewGroup/View 事件分发机制详解

以Android6.0的源码为基础,分析一下Android系统的ViewGroup/View Touch事件的分发机制...

android中view 和 viewgroup事件分发机制

之前已经转载了一篇关于将android中view 和 viewgroup事件分发机制的博客,讲得非常好。 今天又找到一篇讲得很透彻的,转载下来,没事时多看看,多理解理解 以下是转载内容 ...

Android View 事件分发机制源码详解(ViewGroup篇)

前言我们在学习View的时候,不可避免会遇到事件的分发,而往往遇到的很多滑动冲突的问题都是由于处理事件分发时不恰当所造成的。因此,深入了解View事件分发机制的原理,对于我们来说是很有必要的。由于Vi...

Android View、ViewGroup 事件分发机制(二)

Android View、ViewGroup 事件分发机制(二)

Android View框架总结(八)ViewGroup事件分发机制

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52298780 上篇分析了View的事件分发流程,留了一个问题:如...

Android View 事件分发机制 源码解析(ViewGroup篇)

本期三篇文章目录(可点击跳转)一. Android TouchEvent事件传递机制初识 二. android点击事件传递源码讲解(ViewGroup) 三.android点击事件传递源码讲解(...

Android中View和ViewGroup事件分发拦截机制完美分析

出自:http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View。Activity的Touch事...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android View、ViewGroup 事件分发机制(一)
举报原因:
原因补充:

(最多只允许输入30个字)