android事件分发机制

Android 事件分发机制

情到浓时终转凉″ 提交于 2019-12-27 10:51:57
1.View的事件分发 流程 dispatchTouchEvent(): onTouchListener—>onTouch方法 onTouchEvent onClickListener—>onClick方法 ListenerInfo static class ListenerInfo { /** * Listener used to dispatch focus change events. * This field should be made private, so it is hidden from the SDK. * { @hide } */ protected OnFocusChangeListener mOnFocusChangeListener ; /** * Listeners for layout change events. */ private ArrayList < OnLayoutChangeListener > mOnLayoutChangeListeners ; protected OnScrollChangeListener mOnScrollChangeListener ; /** * Listeners for attach events. */ private CopyOnWriteArrayList <

Android事件分发机制--浅显易懂解析

别等时光非礼了梦想. 提交于 2019-12-27 05:49:25
Android事件分发机制的本质 将点击事件向某个View进行传递并且最终得到处理,即当一个点击事件发生后,系统需要将这个事件传递给一个具体的View处理,这个事件的传递过程就是事件分发过程 事件在那些对象传递 Activity、ViewGroup、View分发流程:Activity(Window)-> ViewGroup -> Viewsuper:调用父类方法true:处理事件,事件不在继续往下传递false:不处理事件,事件也不继续传递,交给父控件的onTouchEvent()处理传递: Activity -> ViewGroup -> View 从上往下调用dispatchTouchEvent() View -> ViewGroup -> Activity 从下往上调用onTouchEvent() 1. Activity的事件分发 当一个点击事件发生时,事件最先到达Activity的dispatchTouchEvent()进行事件分发 public boolean dispatchTouchEvent ( MotionEvent ev ) { //一个事件的开始总是从DOWN开始 if ( ev.getAction ( ) == MotionEvent.ACTION_DOWN ) { //默认空方法,每当按键、触摸、trackBall事件分发到当前的Activity就会被调用

Android事件分发机制——Touch事件

对着背影说爱祢 提交于 2019-12-24 04:05:27
1. 简介 先来看一个表: Touch 事件相关方法 功能 Activity ViewGroup View public boolean dispatchTouchEvent (MotionEvent ev) 事件分发 Yes Yes Yes public boolean onInterceptTouchEvent (MotionEvent ev) 事件拦截 No Yes No public boolean onTouchEvent (MotionEvent ev) 事件响应 Yes Yes Yes 从表中可以看出,Activity、ViewGroup、View都关心Touch事件,其中ViewGroup的关心的事件有三个:onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。Activity和View关心的事件只有两个:dispatchTouchEvent、onTouchEvent。也就是说只有ViewGroup可以对事件进行拦截。 Android的UI结构是一个树形结构,树的最顶层(根节点)是Activity内包含的一个ViewGroup,下面有若干个ViewGroup节点,每个节点下面又有若干个ViewGroup节点或者View节点,以此类推。Touch事件的传递和处理与这种结构密切相关

Android学习之事件分发机制

旧巷老猫 提交于 2019-12-18 11:14:51
博文出处: http://blog.csdn.net/sinyu890807/article/details/9097463 当前有一个非常简单的项目,只有一个Activity,并且Activity中只有一个按钮。你可能已经知道,如果想要给这个按钮注册一个点击事件,只需要调用: button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "onClick execute"); } }); 这样在onClick方法里面写实现,就可以在按钮被点击的时候执行。你可能也已经知道,如果想给这个按钮再添加一个touch事件,只需要调用: button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "onTouch execute, action " + event.getAction() ); return false; } }); onTouch方法里能做的事情比onClick要多一些,比如判断手指按下、抬起、移动等事件。那么如果我两个事件都注册了

Android事件分发机制源码解析

你离开我真会死。 提交于 2019-12-11 19:41:57
当手指触摸屏幕的时候,系统就会接收到触摸事件,经过一些列调用以后最终触摸事件会被消费掉。 Motion Event 从触摸屏到应用程序的每个触摸动作都会包装成 MotionEvent 。 MotionEvent 提供了每个触摸事件的信息:触摸动作和相关的元数据(触摸位置,触摸点的手指数以及触摸事件时间)。 MotionEvent 根据动作代码和一组坐标轴的值来描述动作。动作代码指定发生的状态更改,比如手指按下或抬起。坐标轴值描述了位置和其他动作属性。 Pointers 多点触控屏幕会为每一个手指发出一个动作跟踪。产生动作的每个手指或其他对象(鼠标,触摸笔,轨迹球)称为指针。MotionEvent包含了当前处于活动状态的所有指针的信息,即使自上一个事件传递以来其中一些指针未移动也是如此。当用手指触摸屏幕的特定点时,生成的信息由X,Y坐标以及其他信息(如索引,ID等)组成。由于Android支持多点触控,因此指针用于标识在同一时间产生动作的所有对象。 ACTIONS 动作类型及其名称表示作用。可用的动作有: ACTION_DOWN :对象(鼠标,触摸笔,轨迹球)或手指与屏幕接触的第一个点。当手指触摸到屏幕时,触发ACTION_DOWN事件 ACTION_UP :对象(鼠标,触摸笔,轨迹球)或手指释放屏幕的点。当手指从屏幕上拿开时,触发ACTION_UP事件 ACTION_MOVE

Android事件分发机制熟悉

孤人 提交于 2019-12-10 15:36:21
一,android事件分发的对象, Activity,View,ViewGroup 二,事件分发主要包括三个方法, dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent 三,事件正常分发流程, 场景: Activity包括一个ViewGroup,ViewGroup里面又包括一个View 如下图 一次正常的流程分发 Activity dispatchTouchEvent ViewGroup dispatchTouchEvent ViewGroup onInterceptTouchEvent View dispatchTouchEvent View onTouchEvent ViewGroup onTouchEvent Activity onTouchEvent 总体过程是先向下,再回溯。 四,关键方法说明 1,dispatchTouchEvent,根据返回值决定事件是否继续分发 return false 事件停止分发,返回父控件的onTouchEvent return true 顾名思义,事件被消费,就此打住,不在分发 return return super.dispatchTouchEvent(ev) 事件正常分发 2,onInterceptTouchEvent,根据返回值决定是否要拦截事件