Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEvent ev);方法。此方法一般不重写它。而直到莫一个控件能够完成此事件时,调用boolean onTouchEvent(MotionEvent event)方法,即可结束。如果直到醉下层的一个view都没发处理这个,就会往父布局回传,依次调用boolean onTouchEvent(MotionEvent event)方法,直到回到最顶层的布局。 Touch事件传递时,每次分发之后,会调用拦截方法boolean onInterceptTouchEvent(MotionEvent ev)方法,拦截后由拦截者来执行。 Touch事件传递拥有记忆功能,处理了一次事件传递,假定底层布局都没发完成事件,最后是由顶层父布局自己处理的。那么,相同事件再次产生的时候,顶层布局就不会向下分配,而是自己直接处理事件。值得注意的是这个记忆只会在一系列事件完成之前有效,也就是从ACTION_DOWN事件开始,直到后续事件 ACTION_MOVE,ACTION_UP结束后,“记忆”的信息就会清除。
关于Android的Touch事件传递机制,只是知道事件传入Activity后的流程,但是这些事件是如何传递给Activity的一直模糊不清。现在再来好好回顾一遍,顺道整理一点儿东西出来,同时分享给大家。 前面用源码带着大家分享过View的创建和加载,以及View的绘制流程,可以通过阅读原文跳转回顾。今天就随着Android源码一起来探寻一番Android中各View的Touch事件到底是怎么注册和接收的,虽然有一些大神做过分享,但是源码比较老旧,而且通过自己研究会掌握的更透彻一些。本文章主
注:本文解析的源码基于 API 25,部分内容来自于《Android开发艺术探索》。
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
这种事件传递的结果就会导致以下问题: 一个View把Touch事件消费之后,其他View就无法接收到该事件,也就无法根据这个事件完成与用户的交互
一. 手势UIGestureRecognier简介 iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度。利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势。UIGestureRecognizer是一个抽象类,对iOS中的事件传递机制面向应用进行封装,将手势消息的传递抽象为了对象。其中定义了所有手势的基本行为,使用它的子类才能处理具体的手势。 二. 手势的抽象类——UIGesture
在 Android 系统中,触摸事件的分发和处理是一个非常重要的部分。了解触摸事件的分发机制对于我们进行界面交互设计和优化具有重要意义。本文将详细介绍 Android 下的 Touch 事件分发机制,包括事件分发的过程、涉及的方法以及 ViewGroup 中事件分发的实现。
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!
记得刚开始学习Android的时候,对于onTouch相关的事件一头雾水。分不清onTouch(),onTouchEvent()和OnClick()之间的关系和先后顺序,觉得有必要搞清onTouch事件传递的原理。经过一段时间的琢磨以及网上相关博客的介绍,总算是了解了触摸事件传递的机制了,顺便写一篇博客来记录一下。下面就让我们来看看吧。
此处需要特别说明:事件列,即指从手指接触屏幕至手指离开屏幕这个过程产生的一系列事件。一般情况下,事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件。
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )
在移动开发过程当中,我们经常会遇到手势处理和事件触摸的情况,如果不了解整个事件的处理机制,对于开发的同学和码农是非常痛苦的,但是事件触摸的处理确实是一个非常复杂的过程,细讲起来,估计我都能讲迷糊,这里呢,我只做一些简单的和常用事件的讲解,希望能够帮助大家。 1.概念,什么是事件的派发 事件的派发简单来讲就是Activity将事件派发给容器和控件,容器或控件将事件进一步派发给其子容器和子控件,直到事件最终派发到事件发生的焦点控件上。 2.常用的事件触摸方法 我想对于这些常用的事件触摸方法大家都应该有一定的了解
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
以前写 android ,对事件的处理没有太深入,只是简单的 onTouchEvent 就 ok 了,现在写的 UI ,很多自定义组件,父 view 和子 view 都需要接收事件,然后处理。如果不弄明白它的事件传递机制,很难拥有好的用户体验。
继上一篇分析,今天我们来接着分析Activity的Touch事件是如何分发传递的。 都知道在Android中的事件主要包括三部分内容:分发事件dispatchTouchEvent、拦截事件onInterceptTouchEvent、消费事件onTouchEvent。这几乎是所有开发者都要面临的问题,无论是解决一些事件冲突问题,还是自定义View,都会或多或少涉及到。由于其独特的重要性,大多数面试的时候也基本会有所涉及,所以很好的掌握View的Touch事件传递显得尤其重要。 1、Activi
当系统传递一个touch event,首先会send到一个特定的view。对于touch view来讲,这个view就是被hitTest:withEvent:返回的view;对于shaking-motion event,remote-control事件,action messages,和editing-menu message, view就是firstResponder。如果initial view没有处理event,他就会沿着响应链去查找,顺序为: a) hit-test view或者firstResponder会传递event或者message到它的vc上(如果有的话);如果没有vc,则将event或者message传到superView上 b) 如果view或者vc不能handle event或者message,会传到view的superview上。 c) 之后的所有superView会根据a、b的模式进行传输,如果无法handle的话 d) view树的最上层的view,如果无法handle event或者message,会把event send到window对象 e) 如果UIWindow对象无法handle的话,会传递到application对象单例上 f) 如果application单例无法处理event或者message,则discards。
这是一个老生常谈的话题了,也是一个初级开发者必须掌握的技能,但有多少人真正明白呢,夯实基础,方能长远。
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE…->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你就明白了。 android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent 2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent 3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突。比如在使用SliddingMenu菜单的时候,可能会与ViewPager或者其他的一些带有滑动事件的View相冲突,再比如ScrollView嵌套ListView相冲突等等。还有就是在自定义控件的时候,需要处理一些事件时候,也必须把逻辑处理好,父 view 和子view 都需要接收事件,然后处理。如果不明白事件传递机制,很难开发出需要的效果。因此就需要对Android消息传递机制有一个基本的理解与认识,这样才有可能解决开发过程中的需求与问题。
EventBus 常用于 组件 间的事件传递 , 实现了各个组件间的通信 , 如 Activity 与 Fragment 之间的通信 , Activity 与 Service 之间的通信 ;
其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识。也有好多朋友问过我各种问题,比如:onTouch和onTouc
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9097463
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )
响应者:继承UIResponder的对象称之为响应者对象,能够处理touchesBegan等触摸事件
在Android设备中,触摸事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作等。一个最简单的用户触摸事件一般经过以下几个流程:
ViewGroup是一组View的组合,在其内部会包含多个子View,当用户点击屏幕的时候,点击的位置可能在ViewGroup上,也可能在其内部View控件上。
保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs。
1.如何更好的优化一个ListView,使其变得非常流畅? ①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用ViewHolder ④item中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )
前言:在Android开发中,经常会遇到触摸事件冲突,比如ViewPager的轮播图跟Fragment的划动事件冲突,或者轮播图跟下拉事件冲突,自定义view的事件处理等,本文章将会详细介绍Activity、View、ViewGroup三者的触摸事件传递机制,传递包括三个阶段:分发、拦截、消费。
当一个点击事件产生后,他的传递过程遵循Activity->Window->View的逐级传递。我们这里讨论的是在Android系统View里事件传递。
image.png Android面试帮助篇 目录: 1、要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? 2、对于Android 的安全问题,你知道多少? 3、如何缩减APK包大
在Android开发领域,自定义View是一个考察开发者深度功底和创造力的重要方面。本文将从Android面试官的角度出发,深入探讨自定义View面试中常见的12个高级疑难问题,帮助大家更好地准备面试,展示专业技能。
记得在前面的文章中,我带大家一起从源码的角度分析了Android中View的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了。 还未阅读过的朋友,请先参考 Android事件分
因为公司要搬离上海,所以只能出来找工作了,这段时间被虐的够惨的,一个学历就被搞死了,同事工作经验跟我差不多,都是6年的老菜鸟,本科,投了10家面了两家,我投了几十家暂时才面了3家,差距,谁在跟我说学历不是问题,我一砖头拍不死他丫的。废话不多说了,总结了一下:
Android的事件:onClick, onScroll,onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN,表示按下了屏幕。之后,touch将会有后续事件,可能是:
在Android开发中,Android的事件传递可谓比较重要,是一块比较重要的知识体系,不管是日常开发还是面试中熟悉整套的传递机制都尤为重要,Android 事件传递 其实是Android输入子系统的一部分,主要表达APP端接收并传递由IMS捕获到的输入事件的流程,例如 按键Key事件、触摸touch事件等
说到界面交互,很容易想到用户在设备屏幕上的触摸操作。可是屏幕那么大要怎么确定用户触摸的位置呢?Android系统定义了一套屏幕坐标规则,该规则不仅适用于当前的屏幕交互,在后文提及的动画绘制及其他屏幕相关操作等都同样适用。该规则将屏幕的左上角作为屏幕坐标的原点,从左上角往右上角延伸的方向作为屏幕坐标的x轴,从左上角往左下角延伸的方向作为屏幕坐标的y轴。
但是addSubview的UIScorllView并不能直接响应touchesBegan和touchesEnd事件。
领取专属 10元无门槛券
手把手带您无忧上云