Atitit View事件分发机制

1. Atitit View事件分发机制

1. Atitit View事件分发机制1

1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent1

1.1.1. public boolean dispatchTouchEvent(MotionEvent ev)1

1.1.2. public boolean onInterceptTouchEvent(MotionEvent ev)1

1.1.3. public boolean onTouchEvent(MotionEvent event)1

1.2. 事件分发具体流程2

事件分发机制就是弄清楚三个方法,dispatchTouchEvent(),OnInterceptTouchEvent(),onTouchEvent(),和这三个方法与n个ViewGroup和View堆叠在一起的问题,再复杂的结构都能拆分成1个ViewGroup+1个View。

其实ViewGroup和View都是大同小异,View只是没有了子容器,自然不存在拦截问题,dispatch也很简单,所以弄明白了ViewGroup其实就懂的差不多了

方法与控件的对应关系如下表所示:


Touch 事件相关方法


  方法功能 


  ViewGroup  


     Activity    


public boolean dispatchTouchEvent(MotionEvent ev)


事件分发


Yes


Yes


public boolean onInterceptTouchEvent(MotionEvent ev)


事件拦截


Yes


No


public boolean onTouchEvent(MotionEvent ev)


事件响应


Yes


Yes

1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTouchEvent

1.1.1. public boolean dispatchTouchEvent(MotionEvent ev) 

View/ViewGroup处理事件分发的发起者,View/ViewGroup接收到触控事件最先调起的就是这个方法,然后在该方法中判断是否处理拦截或是将事件分发给子容器

1.1.2. public boolean onInterceptTouchEvent(MotionEvent ev) 

ViewGroup专用,通过该方法可以达到控件事件的分发方向,一般可以在该方法中判断将事件给ViewGroup独吞或是它继续传递给子容器,是处理事件冲突的最佳地点

1.1.3. public boolean onTouchEvent(MotionEvent event) 

触控事件的真正处理者,最后每个事件都会在这里被处理

1.2. 事件分发具体流程

MotionEvent ev;//down or move or up or others...
viewgroup.dispatchTouchEvent(ev);

public boolean dispatchTouchEvent(MotionEvent ev){
 boolean isConsumed = false;
   if(onInterceptTouchEvent(ev)){
     isCousumed = this.onTouchEvent(ev);
   }else{
      isConsumed = childView.dispatchTouchEvent(ev);
   }
   return isConsumed;
}

返回结果true表示事件被处理了,返回false表示没有处理。同一个层次中一般最多只有一个容器能够返回true(当然不排除用黑科技咯,有些大神在写牛逼开源控件的时候都会劫持掉MotionEvent来处理滑动效果和冲突等)。

上面的代码通俗易懂,看起来也很简单,一句话就能概括,ViewGroup收到事件后调用dispatch,在dispatch中先检查是否要拦截,若拦截则ViewGroup吃掉事件,否则交给有处理能力的子容器处理。

1.3. 继续来扩展我们的伪代码,

拦截条件判断完之后,决定把事件继续传递给子View的时候,会调用childView.dispatchTouchEvent(ev)

伪代码说完了,ViewGroup的事件传递规则也就差不多说完了,这么看是不是很简单了。View相对于VIewGroup来说就更简单了,没有拦截方法,dispatch基本上是直接调用了自身的onTouchEvent,处理起来一点难度都木有呀

1.4. 设计模式的话,会很快想到观察者模式,例子中的事件分发器正式使用了此模式。

十分钟彻底弄明白View事件分发机制 - 推酷.htm

实例:事件分发器_JavaScript编程学院_IT学院.htm

Android 编程下 Touch 事件的分发和消费机制 - sunzn - 博客园.htm

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon Al Rapanui

埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门  阿尔 拉帕努伊

常用名:艾提拉(艾龙),   EMAIL:[email protected]

转载请注明来源:attilax的专栏   http://www.cnblogs.com/attilax/

--Atiend

时间: 2024-08-24 18:09:19

Atitit View事件分发机制的相关文章

Android:View事件分发机制

关于View事件分发机制的文章已经有很多了,推荐郭霖和鸿洋的两篇文章, http://blog.csdn.net/guolin_blog/article/details/9097463 http://blog.csdn.net/lmj623565791/article/details/38960443 结合他们写的,自己简单总结一下,可能只适用个人. 流程 只要你触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法,源码如下(最新的API源码已经不是这样了,但是分析

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

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

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

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr

android 从源码分析view事件分发机制

一直对View的事件分发机制不太明白,在项目开发中也遇到过,在网上也找到一些解决问题方法,但是其原理并不太了解,现在辞职了有时间,今天写写View的事件分发,结合android源码一起来学习下,如果讲的不对,往指出一起学习提高,言归正传. 新建一个android项目,里面只有一个activity,有一个button,我们给Button设置setOnClickListener(),setOnTouchListener(),通过log看看结果: btnClick.setOnClickListener

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

之前自认为对于Android的事件分发机制还算比较了解,直到前一阵偶然跟人探讨该问题,才发现自己以前的理解有误,惭愧之余遂决定研习源码,彻底弄明白Android的事件分发机制,好了废话少说,直接开干. 首先,我们对Android中的touch事件做一下总结,主要分为以下几类: 1.Action_Down  用户手指触碰到屏幕的那一刻,会触发该事件: 2.Action_Move   在触碰到屏幕之后,手指开始在屏幕上滑动,会触发Action_Move事件: 3.Action_Up       在用

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

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52282833 View布局告一段落,从本篇开始View事件相关分析,今天分析的是View的事件分发机制(PS:本篇文章中源码均是android 6.0,请知晓) View 事件的分发机制 dispatchTouchEvent onInterceptTouchEvent onTouchEvent 案例 事件通常重要的有如下三种: MotionEvent.ACTION_

Android View事件分发机制

最近在开发中遇到view滑动冲突的问题,由于一开始就知道这个问题与view事件分发有关,之后在网上看了几篇关于事件分发的资料后,开发中遇到的问题很快便得到解决. 在这里总结一下我对view事件分发的理解. 首先,看下事件分发流程图: Button事件演示 在对view的事件分发机制进行分析前,我们可以通过一个demo看看Button的事件处理的流程. 在布局文件中添加一个button控件,然后在代码中实现Button的setOnClickListener和setOnTouchListener方法

Android View 事件分发机制梳理

View初探 一直以来对View的事件分发机制很晕,今天就在这里梳理一下 MyView 首先继承View类,自定义一个MyView.并在初始化时打印View类是否可点击,这里从View点击事件分发的角度出发,所以不考虑绘制,测量相关方法的实现. public class MyView extends View { String TAG = "Activity"; public MyView(Context context) { super(context); init(); } pub

Android开发-分析ViewGroup、View的事件分发机制、结合职责链模式

介绍 上一篇博客职责链/责任链模式(Chain of Responsibility)分析理解和在Android的应用 介绍了职责链模式,作为理解View事件分发机制的基础. 套用职责链模式的结构分析,当我们的手指在屏幕上点击或者滑动,就是一个事件,每个显示在屏幕上的View或者ViewGroup就是职责对象,它们通过Android中视图层级组织关系,层层传递事件,直到有职责对象处理消耗事件,或者没有职责对象处理导致事件消失. 关键概念介绍 要理解有关View的事件分发,先要看几个关键概念 Mot