Android touch mode和focusableInTouchMode分析
首先我们来看看touch mode的定义。它是用户和手机进行交互时view层次结构的一个状态。它本身是很容易理解的,
代表了最近一次的交互是否是通过触摸屏发生的,因为在Android设备上还存在别的交互方式,比如D-pad、滚动球等等。
为什么Android会引入这样一个mode呢?这是因为从交互、设计方面考虑,当用户直接使用keys或trackball与UI
进行交互的时候,必须先使目标控件获得焦点(比如高亮起来),这样用户才会注意到是什么控件在接收输入。然而如果
设备支持触摸手势的话,用户直接用手指点击控件,这个时候当然就没必要将目标控件高亮了(即获取焦点)。
对于一个拥有触摸屏功能的设备而言, 一旦用户用手点击屏幕, 设备会立刻进入touch mode。这时候被点击的控件
只有isFocusableInTouchMode()为true的时候才会获得focus,比如EditText控件。其他可以触摸的控件比如Button
(其isFocusableInTouchMode默认为false), 当被点击的时候不会获取焦点,它们只是简单地执行onClick事件而已。
任何时候只要用户点击key或滚动trackball, 设备就会退出touch mode,并且找一个view将焦点置于其上,这样用户
可以在不需要再次触摸屏幕的情况下接着和UI进行交互。touch mode在整个系统运行期间都是有效的(跨activities),任何
时候都可以调用View.isInTouchMode()方法来查看当前设备是否处于touch mode状态。
从上面的介绍我们能看出来,在触摸屏下的view,设置了focusableInTouchMode和没设置在用户体验上是不同的,
其实内部的处理逻辑也是不同的,比如:没设置这个属性的控件在用户触摸交互时是不会获得focus的,也就是说focus在
touch过程中是不会改变的,只是其onClickListener如果设置了的话会在up事件到来时触发。而如果设置了focusableInTouchMode
属性的话,它的行为是首先尝试获得focus,如果获得成功的话其onClickListener是不会触发的,只有当你第2次再点击它时,
才会执行onClickListener。可能有些同学在开发中也遇到过这个问题,stackoverflow上有一个同样的问题:
http://stackoverflow.com/questions/20473355/button-is-not-calling-onclicklistener-with-first-click?lq=1,
大家可以参考下。由于设置了这个属性后会引起和android正常交互行为的不一致,所以android建议我们保守地使用这个属性,
在你确定要用它之前最好三思而后行,并且确保你自己看过Android developers blog里关于touch mode介绍的文章:
http://android-developers.blogspot.com/2008/12/touch-mode.html
关于设置了这个属性后行为不一致的问题,我们在后面touch事件的处理过程中还会再次提到,那时我们就可以从源码
的角度来看看原因了。
Android touch mode和focusableInTouchMode分析的更多相关文章
- Android Touch消息传递机制探究分析
		
在Android中,消息的传递控制主要是通过两个方法共同配合使用来对用户的触摸消息进行分发的,下面就来看看这两个方法: onInterceptTouchEvent:此方法定义于ViewGroup中,顾 ...
 - Android Touch事件原理加实例分析
		
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
 - Android Touch事件传递机制 二:单纯的(伪生命周期)
		
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
 - Android PopupWindow的使用和分析
		
Android PopupWindow的使用和分析 PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activi ...
 - Android touch事件的派发流程
		
Android TouchEvent事件传递机制 通俗易懂,能够了解Touch事件派发的基本流程. Android中的dispatchTouchEvent().onInterceptTouchEven ...
 - Android笔记:触摸事件的分析与总结----TouchEvent处理机制
		
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
 - Android Touch事件传递机制具体解释 上
		
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...
 - Android Touch事件传递机制 二:单纯的(伪生命周期)  这个清楚一点
		
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
 - Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇
		
2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...
 
随机推荐
- Eclipse窗口总是在最前的解决办法
			
Eclipse窗口总是在最前的解决办法 状况: Eclipse在偶然的情况下,会莫名其妙地保持在窗口的最前面,一直保持在最前:然后alt + tab,或者鼠标点击其他窗口.想切换/激活其他窗口时,根本 ...
 - MVC4在IIS6上部署遇到的问题
			
最近的一个项目结束了,花的时间一个月左右吧..... 开发环境 win7+VS2012+MVC4(.net 4.0)+SQL SERVER 2008 部署环境 windows server 2003 ...
 - 【转载】Visaul Studio 常用快捷键的动画演示
			
在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visua ...
 - 十年微软(Microsoft)MVP
			
十年微软(Microsoft)MVP,七月一日收到邮件,今早收到从美国微软寄过来的证书!
 - 基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理
			
在很多Web界面中,我们都可以看到很多下拉列表的元素,有些是固定的,有些是动态的:有些是字典内容,有些是其他表里面的名称字段:有时候引用的是外键ID,有时候引用的是名称文本内容:正确快速使用下拉列表的 ...
 - SingalR--demo
			
原文链接 : http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and ...
 - 详谈Hibernate框架关系映射!
			
接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!! 你还可以保存一个对象, ...
 - 【C#进阶系列】17 委托
			
委托主要是为了实 现回调函数机制,可以理解为函数指针(唯一不同的在于多了委托链这个概念). 然而用的时候可以这么理解,但是委托的内部机制是比较复杂的. 一个委托的故事 delegate void ra ...
 - PYTHON3连接MYSQL数据库
			
http://smilejay.com/2013/03/python3-mysql-connector/ Python 2.x 上连接MySQL的库倒是不少的,其中比较著名就是MySQLdb(Djan ...
 - Rest.Ler PHP API Server解决方案
			
https://github.com/Luracast/Restler 通过composer安装依赖后,整个vendor将近三十兆.这太不爽了.搞PHP的人如果没有洁癖的追求,跟搞Java的咸鱼有神码 ...