• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android_事件纷发

Android_事件纷发

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了纷发,分发和纷发,android事件分发机制,android 事件分发,android 点击事件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android_事件纷发


关于事件你应该知道的是
当一个事件产生后,他的传递过程遵循如下顺序Activity > Window > View
事件来源于activity,activity假如你没有重写任何关于事件纷发的方法的话,他会把事件传递给window,window将事件传递给decorView

现在我们来看下假如我们在activity中重写了dispatchEvent的方法是什么样的一个情况.

我们把activity中的dispatchTouchEvent 返回true
这里写图片描述
事件被activity的dispatchTouchEvent消耗掉,所以activity的
onTouchEvent方法得不到响应,我们看下log输出
这里写图片描述
很明显的能看出来,log只打印了dispatchTouchEvent中的相关方法,整个事件被dispatchTouchEvent消耗掉,并没有传递到我们的window > decorView 所有我界面的返回键接受不到事件,所以返回按钮的点击事件也没生效,

我们在把activity中的dispatchTouchEvent返回false看看是什么情况,,这也是我的一个疑问点,麻烦大神帮忙解答一下就是我activity中的dispatchTouchEvent返回了false,那么事件标志着事件没人处理,此时事件的根源是从activity来的,如果他都不管的话,这个事件已经不能返回他的父view ,当前activity的onTouchEvent()也无log输出,那么事件哪里去了????
这里写图片描述
然后我们看下返回false的log输出如下图:
这里写图片描述
log输出一只执行了activity中的dispatchTouchEvent的相关方法,
TouchEvent并没有任何输出,表明activity的onTouchEvent也没有接受到这个事件,此时我再点击返回键,的onclick依然是失效的,
所以.麻烦大神帮忙解答下这一点,当activity中的dispatchtouchevent返回false,事件的流程是怎么样的,???

最后我们让activity中的dispatchtouchevent 返回super看下
这里写图片描述
然后看下log日志的输出,以及log 的顺序,
这里写图片描述

注意log的顺序,dispatchTouchEvent down > onTouchEvent down
dispatchTouchEvent move > onTouchEvent move
dispatchTouchEvent up > onTouchEvent up

面试的时候注意面试官问的问题,和执行顺序的问题

然后我们往activity中加入一个linearlayout,我们重写一下linearlayout的有关事件的三个方法,并打印log看一下,暂时不往linearlayout中加入任何子view,单纯的看一下事件从activity传递到viewgroup的效果.

首先我们在书写一个TESTLinearlayout,如下

public class AAATestLinearlayout extends LinearLayout {
    private static final String TAG = "AAATestLinearlayout";

    public AAATestLinearlayout(Context context) {
        super(context);
    }

    public AAATestLinearlayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AAATestLinearlayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Logger.e(TAG, TAG + ">>>>dispatchTouchEvent.ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Logger.d(TAG, TAG + ">>>>dispatchTouchEvent.ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Logger.w(TAG, TAG + ">>>>dispatchTouchEvent.ACTION_UP");
                break;
        }

//        return true;
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Logger.e(TAG, TAG + ">>>>onInterceptTouchEvent.ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Logger.d(TAG, TAG + ">>>>onInterceptTouchEvent.ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Logger.w(TAG, TAG + ">>>>onInterceptTouchEvent.ACTION_UP");
                break;
        }

//        return true;
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Logger.e(TAG, TAG + ">>>>onTouchEvent.ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Logger.d(TAG, TAG + ">>>>onTouchEvent.ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Logger.w(TAG, TAG + ">>>>onTouchEvent.ACTION_UP");
                break;
        }

        return super.onTouchEvent(event);
    }

}

我们就先默认的让测试的linearlayout全部返回super值.

看下事件传递的过程从activity > window > decorView > 我们自己的linearlayout;
这里写图片描述

并且我们在linearlayout中的构造中设置了额外的onTouchLinstener,
我们看下的结果;
这里写图片描述
这里写图片描述

这里简答描述一下,我们往activity中加入了一个linearlayout.并且在构造中给linearlayoutset了一个touchlistener.
我们从log可以看到,事件从activity中开始传递,然后我们在linearlayout中有关事件的方法全部返回super.
其中关于onInterceptTouchEvent
我想说两句,这句话的返回值影响的是viewgroup容器中子view的事件传递,并不会对当前的viewgroup的onTouchEvent或者set 的touchlistener有影响,我们从log可以看出来,linearlayout的 onTouchEvent.down 和 touchliste的down均执行了

假如onInterceptTouchEvent的值返回的是super的话,我们看viewgroup的源码可以知道
默认是false,也就是不拦截…重要的是不拦截….

    * appear here.
     * 
     *
     * @param ev The motion event being dispatched down the hierarchy.
     * @return Return true to steal motion events from the children and have
     * them dispatched to this ViewGroup through onTouchEvent().
     * The current target will receive an ACTION_CANCEL event, and no further
     * messages will be delivered here.
     */
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }

这是viewgroup的源码,和Android艺术探索第143页第六条说的完全吻合,
还有一篇博客,应该是比较经典的,其中对onInterceptTouchEvent的解释如下;
这里写图片描述

这里博客博主说是返回super的话默认被拦截,并把拦截的事件交给当前view,处理,
我们这里的当前view就是我们的linearlayoutlayout 从log看确实执行了onTouchEvent.但是这个onTouchEvent并不是因为返回了super他没有拦截而执行了.因为笔者试着返回true false,super,对我们设置的touchlistener和onTouchEvent的down事件没有任何影响,

所以这块我也迷茫了半天,看了书本和咨询了群里的nil大概猜测一下可能是博主理解有出入或者笔误,再次留下博客的地址:请大神批阅和校正一下原文链接如下Android编程下的事件纷发

接着说我们的场景,目前我们linearlayout中的事件处理方法均没有对事件做处理,这样我们linearlayout中的子view比如我们的返回按钮确实能接收到事件,然后点击返回箭头,activity关闭,此事第一个场景走完.

第二个场景,我们把我们的liearlayout中的dispatchTouchEvent返回true,
我们猜想是这样的,如果返回true,事件就在当前的方法中终止了也就是在liearlayout中终止,所以其他的方法根本不会接收到这个事件,所以看下我们执行的log输出,
这里写图片描述

这里写图片描述

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android_事件纷发

相关文章

  • 2017-05-228.3.4 Paint API之—— Xfermode与PorterDuff详解(一)
  • 2017-05-26linux tun/tap设备的实现(kennel 3.10)
  • 2017-05-26Android系统的五种数据存储形式(二),android数据存储
  • 2018-11-27android studio开发控件布局
  • 2017-05-26Andorid Scrolling Activity(CoordinatorLayout详情),scrollingactivity
  • 2017-05-26Android消息机制
  • 2017-05-26Android点击跳转到淘宝的某一商品详情页或者某一店铺页面,android商品详情
  • 2017-05-26Mac下载安装Android Studio教程,androidstudio
  • 2017-05-26微信小程序监控,信小程序监控
  • 2017-05-26android列表停止滚动,加载图片,较为通用的一种办法,

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 酷欧天气(CoolWeather)应用源码,coolweather
    • Android Native crash日志分析,androidcrash
    • android Listview的自定义界面的使用
    • 用设计精美的阅读指读应用项目源码,设计精美源码
    • 友盟的多渠道打包,友盟打包
    • zabbix监控tomcat出现"Connection refused to host: 127.0.0.1"的故障解决
    • ubuntu下安装AndroidStudio
    • 7.5.4 WebView文件下载
    • Android之TextView,androidtextview
    • 一起来学习Android自定义控件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有