MainActivity如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package cn.c;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
 
/**
 * Demo描述:
 * 分析Android事件分发和处理机制
 *
 * 在该示例中涉及到三个自定义的View.分别是:
 * 最外层的布局MyFrameLayout
 * 内层的布局MyLinearLayout
 * 最里层的自定义按钮MyButton
 *
 * 在dispatchTouchEvent()源码分析中提到一个很重要的东西:
 * 如果一个View没有处理ACTION_DOWN事件,即对于该事件返回了false(没有消费该事件)
 * 那么后续的ACTION_MOVE和ACTION_UP均不会再传递到该View;也就是说该View没有了
 * 处理ACTION_MOVE和ACTION_UP的资格.
 * 对于该问题,在此予以验证.
 *
 *
 * MyButton的onTouchEvent()方法中直接返回false.
 * 那么可以看到MyButton只处理了ACTION_DOWN.
 * 类似的MyFrameLayout和MyLinearLayout对于Touch事件也直接返回了false;他们也就处理不到
 * ACTION_MOVE和ACTION_UP
 *
 */
 
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println(===> MainActivity 中调用 onCreate());
        System.out.println(--------------------------------------------------);
    }
     
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        System.out.println(===> MainActivity 中调用 dispatchTouchEvent());
        System.out.println(===> super.dispatchTouchEvent()默认返回true);
        System.out.println(--------------------------------------------------);
        return super.dispatchTouchEvent(ev);
    }
 
    @Override
    public void onUserInteraction() {
        System.out.println(===> MainActivity 中调用 onUserInteraction());
        System.out.println(--------------------------------------------------);
        super.onUserInteraction();
    }
     
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            System.out.println(===> MainActivity 中调用  onTouchEvent()--->ACTION_DOWN);
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println(===> MainActivity 中调用  onTouchEvent()--->ACTION_MOVE);
            break;
        case MotionEvent.ACTION_UP:
            System.out.println(===> MainActivity 中调用  onTouchEvent()--->ACTION_UP);
        default:
            break;
        }
        System.out.println(super.onTouchEvent()默认返回false 表示未消费事件);
        System.out.println(--------------------------------------------------);
        return super.onTouchEvent(event);
    }
     
}

MyFrameLayout如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package cn.c;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;
 
public class MyFrameLayout extends FrameLayout{
    public MyFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        super.dispatchTouchEvent(ev);
        System.out.println(外层MyFrameLayout 中调用  dispatchTouchEvent());
        System.out.println(super.dispatchTouchEvent()默认返回true 表示继续分发);
        System.out.println(--------------------------------------------------);
        return super.dispatchTouchEvent(ev);
        //return false;
    }
     
    //覆写自ViewGroup
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        System.out.println(外层MyFrameLayout 中调用  onInterceptTouchEvent());
        System.out.println(super.onInterceptTouchEvent()默认返回false 表示不拦截);
        System.out.println(--------------------------------------------------);
        return super.onInterceptTouchEvent(ev);
    }
    //注意:
    //1 ViewGroup是View的子类
    //2 ViewGroup中onTouchEvent()方法默认返回的是false
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            System.out.println(外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_DOWN);
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println(外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_MOVE);
            break;
        case MotionEvent.ACTION_UP:
            System.out.println(外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_UP);
        default:
            break;
        }
        System.out.println(super.onTouchEvent()默认返回false 表示未消费事件);
        System.out.println(--------------------------------------------------);
        return super.onTouchEvent(event);
        //return true;
    }
     
     
 
}

MyLinearLayout如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package cn.c;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
 
public class MyLinearLayout extends LinearLayout {
    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
     
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        super.dispatchTouchEvent(ev);
        System.out.println(内层MyLinearLayout 中调用  dispatchTouchEvent());
        System.out.println(super.dispatchTouchEvent()默认返回true 表示继续分发);
        System.out.println(--------------------------------------------------);
        return super.dispatchTouchEvent(ev);
        //return false;
    }
     
    //覆写自ViewGroup
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        super.onInterceptTouchEvent(ev);
        System.out.println(内层MyLinearLayout 中调用  onInterceptTouchEvent());
        System.out.println(super.onInterceptTouchEvent()默认返回false 表示不拦截);
        System.out.println(--------------------------------------------------);
        return super.onInterceptTouchEvent(ev);
         
    }
    //注意:
    //1 ViewGroup是View的子类
    //2 ViewGroup中onTouchEvent()方法默认返回的是false
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            System.out.println(内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_DOWN);
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println(内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_MOVE);
            break;
        case MotionEvent.ACTION_UP:
            System.out.println(内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_UP);
        default:
            break;
        }
        System.out.println(super.onTouchEvent()默认返回false 表示未消费事件);
        System.out.println(--------------------------------------------------);
        return super.onTouchEvent(event);
    }
     
     
 
}

MyButton如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package cn.c;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
 
public class MyButton extends Button{
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
     
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        System.out.println(自定义Button 中调用 dispatchTouchEvent());
        System.out.println(super.dispatchTouchEvent默认返回true);
        System.out.println(--------------------------------------------------);
        return super.dispatchTouchEvent(event);
    }
     
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_DOWN);
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_MOVE);
            break;
        case MotionEvent.ACTION_UP:
            System.out.println(自定义Button 中调用 onTouchEvent()--->ACTION_UP);
            break;
        default:
            break;
        }
        System.out.println(--------------------------------------------------);
        //return false;
        return true;
    }
     
     
}
1
2
3
4
5
<cn.c.myframelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <cn.c.mylinearlayout android:layout_height="wrap_content" android:layout_width="wrap_content">
           <cn.c.mybutton android:layout_height="200dip" android:layout_width="200dip" android:text="自定义Button" android:textcolor="@android:color/black">
    上一篇http://www.2cto.com/kf/201412/365609.html</cn.c.mybutton></cn.c.mylinearlayout>
</cn.c.myframelayout>

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com

Android事件分发详解(六)——ACTION_DOWN的消费验证的更多相关文章

  1. Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

    package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...

  2. Android系统输入事件分发详解

    什么是输入事件? 我们知道,运行android系统的设备本质上是一台计算机,使用者在和计算机进行交互的时候可以抽象成简单的对计算机的输入和输出(IO).那么对于运行在计算机上的操作系统来说,操作系统在 ...

  3. Android事件分发机制详解(2)----分析ViewGruop的事件分发

    首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接 ...

  4. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  5. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  6. Android 自定义 View 详解

    View 的绘制系列文章: Android View 绘制流程之 DecorView 与 ViewRootImpl Android View 的绘制流程之 Measure 过程详解 (一) Andro ...

  7. Android事件分发与责任链模式

    一.责任链模式 责任链模式是一种行为模式,为请求创建一个接收者的对象链.这样就避免,一个请求链接多个接收者的情况.进行外部解耦.类似于单向链表结构. 优点: 1. 降低耦合度.它将请求的发送者和接收者 ...

  8. Android事件分发机制二:viewGroup与view对事件的处理

    前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...

  9. 本以为精通Android事件分发机制,没想到被面试官问懵了

    文章中出现的源码均基于8.0 前言 事件分发机制不仅仅是核心知识点更是难点,并且还是View的一大难题滑动冲突解决方法的理论基础,因此掌握好View的事件分发机制是十分重要的. 一.基本认识 1. 事 ...

随机推荐

  1. tableau备份

    备份:数据库备份:https://help.tableau.com/current/server-linux/zh-cn/cli_maintenance_tsm.htm#tsm https://hel ...

  2. 3、APK file does not exist on disk

    参考:https://blog.csdn.net/ouyang_peng/article/details/51243441 亲测可以解决

  3. 小记---------maxwell启动闪退问题

    日志报错信息如下:大致是说因为maxwell在对接mysql时伪装成一个从库slave,但是uuid重复.猜想是其他部门同事也在同时使用maxwell,都使用的是maxwell默认的uuid ,从而导 ...

  4. Spring(六)--Spring配置文件之间的关系

    Spring配置文件之间的关系 1.需要的实体类 2.需要的xml文件 3.测试类 未完待续!!!

  5. HDU 2586——How far away ?

    Time limit 1000 ms Memory limit 32768 kB Description There are n houses in the village and some bidi ...

  6. 关于setter 和 getter方法的一些总结(初级)

    1.最基础的set 和 get 准备工作 Person.h @interface Person : NSObject { NSString *_hobby; // ObjC建议成员变量带"_ ...

  7. 原生js:click和onclick本质的区别(转https://www.cnblogs.com/web1/p/6555662.html)

    原生javascript的click在w3c里边的阐述是DOM button对象,也是html DOM click() 方法,可模拟在按钮上的一次鼠标单击. button 对象代表 HTML 文档中的 ...

  8. mysql在docker下运行,出现中文乱码

  9. Core Graphics 定制UIVIew 处理图片

    许多UIView的子类,如UIButton或UILabel,它们的形状都是系统固定的.但是,对于一些特殊的情况,我们需要绘制产品狗想要的图形.那么等待我们的只有两个选择:第一,可以使用UIImageV ...

  10. python常见问题解决方案

    平时工作中经常需要用到这些python小技巧,顺便做个记录 import requests import time def get_pr(domain): pr = 6 time.sleep(1) h ...