Activity事件分发机制

标签: android View事件分发
5人阅读 评论(0) 收藏 举报

一、事件分发的基本概念

1、MotionEvent
View触摸事件通过MotionEvent来表示,主要分为:
* ACTION_DOWN:手指按下
* ACTION_UP:手指抬起
* ACTION_MOVE:手指移动
* ACTION_CANCEL:非正常取消
2、当View的点击事件产生后,首先传递到Activity上,然后一层层传递到ViewGroup中,最终传递到View中。
3、事件分发主要的三个方法:
* dispatchTouchEvent:事件分发的方法
* onInterceptTouchEvent:事件拦截的方法。在Activity和View都没有这个方法,如果Activity拦截了那整个屏幕都无法响应事件,View作为事件最后的接收者,要么消耗,要么不处理,也不需要进行事件拦截。
* onTouchEvent:事件处理的方法。返回值为true表示要消耗当前事件。

二、dispatchTouchEvent

   public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction(); (1)
        }
        //window的dispatchTouchEvent方法返回为true时,该方法返回true,否者执行onTouchEvent方法
        if (getWindow().superDispatchTouchEvent(ev)) { (2)
            return true;
        }
        return onTouchEvent(ev);
    }

(1)

public void onUserInteraction() {
}

此方法为空方法。当此activity在栈顶时,触屏点击按home,back,menu键等都会触发此方法。下拉statubar、旋转屏幕、锁屏不会触发此方法。
(2) getWindow().superDispatchTouchEvent(ev):
调用了抽象类Window的superDispatchTouchEvent抽象方法。具体实现在哪?
PhoneWindow是Window的唯一实现类。

**PhoneWindow**
Override
public boolean superDispatchTouchEvent(MotionEvent event) {
    return mDecor.superDispatchTouchEvent(event);
}

内部调用了DecorView的superDispatchTouchEvent方法,

private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
    ......
}
  • DecorView类是PhoneWindow类的一个内部类
  • DecorView继承自FrameLayout,是所有界面的父类
**DecorView**
public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
}

内部调用了ViewGroup的dispatchTouchEvent方法。

总结:getWindow().superDispatchTouchEvent(ev) 是调用了ViewGroup的dispatchTouchEvent方法。

三、onTouchEvent

public boolean onTouchEvent(MotionEvent event) {
        if (mWindow.shouldCloseOnTouch(this, event)) {
            finish();
            return true;
        }

        return false;
    }

总结:
* 事件传递路径 Activity -> PhoneWindow -> DecorView -> ViewGroup
* Activity的dispatchTouchEvent方法调用了ViewGroup的dispatchTouchEvent方法,并且如果其返回值为false,才会调用Activity的onTouchEvent方法,此时dispatchTouchEvent返回值受onTouchEvent方法返回值的影响。
(问题:啥时候ViewGroup的dispatchTouchEvent方法返回false,也就是说啥时候onTouchEvent方法会执行)

查看评论

Android事件分发机制源码畅游解析(Activity篇)

本篇是事件分发的终篇(涉及到其他知识点先不细说),建议先研究下View篇 和 ViewGroup篇 。可有童鞋就说了,就喜欢先看总体框架、流程,再仔细琢磨,那么咱就开工!...
  • hds2011
  • hds2011
  • 2017-04-25 16:34:29
  • 238

View的事件分发机制(Activity篇)

这篇博客主要介绍在一个TouchEvent从Activity传递到View的流程,照例附上一张流程图:我们的TouchEvent首先接收到这个TouchEvent的是Acitivty中的dispatc...
  • freedom13905149949
  • freedom13905149949
  • 2016-07-21 17:42:44
  • 1429

站在大神肩膀上,深入理解 Android事件分发机制

站在大神肩膀上,深入理解android事件分发机制
  • cjc_karen
  • cjc_karen
  • 2016-05-13 01:19:02
  • 5988

Android事件分发机制 详解攻略,您值得拥有

前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化等等 今天,我...
  • carson_ho
  • carson_ho
  • 2017-01-06 11:43:05
  • 53322

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

本期三篇文章目录(可点击跳转)一. Android TouchEvent事件传递机制初识 二. android点击事件传递源码讲解(ViewGroup) 三.android点击事件传递源码讲解(...
  • dfskhgalshgkajghljgh
  • dfskhgalshgkajghljgh
  • 2016-12-06 20:11:12
  • 1443

Dialog的不完全事件分发机制

说是不完全,一是觉得自己语言表述不完美,二是觉得没有方方面面都分析到。         首先我们知道以下知识:         setCancelable(false); dialog弹出后会...
  • For_Forever
  • For_Forever
  • 2017-07-17 23:11:12
  • 148

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

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

浅谈Android事件分发机制

在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview、RecyclerView之间的嵌套使用。在很好的解决此类问题之前,我们应深入的了解Androi...
  • salmon_zhang
  • salmon_zhang
  • 2017-08-06 09:44:24
  • 389

完全理解android事件分发机制

前言之前笔者其实已经写过事件分发机制的文章:快速理解android事件传递拦截机制概念 但是,现在看来其实更像是一篇知识概括,多处可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,...
  • Double2hao
  • Double2hao
  • 2017-01-12 10:04:06
  • 900

【Android面试笔记】(一)事件分发机制

首先我们必须了解三个方法 1.dispatchTouchEvent 2interceptTouchEvent      3.TouchEvent 下面先介绍第一个:dispatchTouchEvent...
  • u011669081
  • u011669081
  • 2015-10-18 18:19:52
  • 1885
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 430
    排名: 11万+
    文章分类
    最新评论