android 事件机制,

2024-09-07 08:48
文章标签 android 事件 机制

本文主要是介绍android 事件机制,,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

view的事件机制:

不管是DOWN,MOVE,UP都会按照下面的顺序执行:

1、dispatchTouchEvent,(其中这个方法包括了setOnTouchListener(),还有onTouch()方法

2、 setOnTouchListener的onTouchListener

3、onTouchEvent 

分析在dispatchTOucheEvent()首先判断mOnTouchListener不为null,并且view是enable的状态,然后 mOnTouchListener.onTouch(this, event)返回true,这三个条件如果都满足,直接return true ; 也就是不执行onTouchEvent(event);

(1)mOnTouchListener是否为null就的看他什么时候负值的,这个时候我们在源码中看到setOnTouchListener()

(2)ENABLED是判断当前点击的控件是否是enable的,按钮默认都是enable的,因此这个条件恒定为true。

(3) mOnTouchListener.onTouch(this, event),回调控件注册touch事件时的onTouch方法。也就是说如果我们在onTouch方法里返回                   true,就会让这三个条件全部成立,从而整个方法直接返回true。如果我们在onTouch方法里返回false,就会再去执行                                       onTouchEvent(event)方法。

   注:这里面就会出现你在代码中view.setOnTouchListener(new OnTouch(){   return  true}),导致了你onTouchEvent(event)没执行了

onTouchEvent()方法中 就会去判断你的点击事件类型 比如长按还是点击,手指的操作类型,按下,移动,抬起,(对了这个里面点用了onclick()方法,这个需要知道)

 (1) setEnable(false),CLICKABLE 都是在这个里面进行判断,false的话都会直接return false;

 (2)onclick()方法在switch()中up情况下调用(先是调用performClick() ,onclick()就在这个方法中),这个方法其实就是      我们            长写的button.setOnClickListener(new OnClickListener(....))

ViewGroup事件分发:

其实比上面的view多了一些流程,就是事件怎么传递的,怎么
 这里举个栗子,(1)公司项目bug了,老板一般先找项目经理,然后项目经理再去找你,然后你解决bug,然后告诉经理,经理就不用管了(一个正常的分发)
这里的bug就是一个事件,老板就是一个屏幕吧,项目经理就是一个viewGroup,你就是一个button,
(2)公司项目bug了,老板找项目经理,经理自己解决了bug,就不去找你了,(相当于事件  给拦截了)
(3)公司项目bug了,老板找经理,经理丢给你,你发现自己解决不了,有丢给经理,然后经理给解决了(事件回传)
带着这个栗子去理解源码:

分析:把ViewGroup看作一个View,一样执行上面view的3个循序,只是在dispatchTouchEvent()中多了一个事件拦截的步骤也就是disallowIntercept变量和onInterceptTouchEvent(ev)方法,他拦截之后就不给他下面的view或者viewGroup了,如果不拦截,就给传下去下面的view和viewGroup去处理事件 ,如果这些事件在view和viewGroup没有处理,那么会回传去,这个ViewGroup自己去处理事件,处理事件就是相当于view的事件了。。。

事件拦截,是由disallowInercept || !onInterceptTouchEven(ev)  控制的(或的关系,第二个条件取放。。不要看错了)
(1)disallowIntercept是指是否禁用掉事件拦截的功能,默认是false,也可以通过调用requestDisallowInterceptTouchEvent方法对这个值进行修改
(2)onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
 子view和ViewGroup把事件处理掉了 ,直接在onTouchEvent()中返回true就可以了,返回false就会回传给他的父控件,

最后说下事件拦截的一些事例(http://blog.csdn.net/lmj623565791/article/details/39102591)

(1)如何拦截

重写ViewGroup的onInterceptTouchEvent方法
@Override  public boolean onInterceptTouchEvent(MotionEvent ev)  {  int action = ev.getAction();  switch (action)  {  case MotionEvent.ACTION_DOWN:  //如果你觉得需要拦截  return true ;   case MotionEvent.ACTION_MOVE:  //如果你觉得需要拦截  return true ;   case MotionEvent.ACTION_UP:  //如果你觉得需要拦截  return true ;   }  return false;  }  
默认是不拦截的,即返回false;如果你需要拦截,只要return true就行了,这要该事件就不会往子View传递了,并且如果你在DOWN retrun true ,则DOWN,MOVE,UP子View都不会捕获事件;如果你在MOVE return true , 则子View在MOVE和UP都不会捕获事件。

原因很简单,当onInterceptTouchEvent(ev) return true的时候,会把mMotionTarget 置为null ; 

(2)如何不被拦截

如果ViewGroup的onInterceptTouchEvent(ev) 当ACTION_MOVE时return true ,即拦截了子View的MOVE以及UP事件;

此时子View希望依然能够响应MOVE和UP时该咋办呢?

Android给我们提供了一个方法:requestDisallowInterceptTouchEvent(boolean) 用于设置是否允许拦截,我们在子View的dispatchTouchEvent中直接这么写:

@Override  public boolean dispatchTouchEvent(MotionEvent event)  {  getParent().requestDisallowInterceptTouchEvent(true);    int action = event.getAction();  switch (action)  {  case MotionEvent.ACTION_DOWN:  Log.e(TAG, "dispatchTouchEvent ACTION_DOWN");  break;  case MotionEvent.ACTION_MOVE:  Log.e(TAG, "dispatchTouchEvent ACTION_MOVE");  break;  case MotionEvent.ACTION_UP:  Log.e(TAG, "dispatchTouchEvent ACTION_UP");  break;  default:  break;  }  return super.dispatchTouchEvent(event);  }  
getParent().requestDisallowInterceptTouchEvent(true);  这样即使ViewGroup在MOVE的时候return true,子View依然可以捕获到MOVE以及UP事件。

参考博客:或者想细看事件分发的话
看到一个介绍很全面的文章http://blog.csdn.net/carson_ho/article/details/54136311
http://blog.csdn.net/guolin_blog/article/details/9153747
http://blog.csdn.net/lmj623565791/article/details/39102591

http://www.open-open.com/lib/view/open1462179977450.html

这篇关于android 事件机制,的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144619

相关文章

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析