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 ...
随机推荐
- ES6笔记(1) -- 环境配置支持
系列文章 -- ES6笔记系列 虽然ES6已经发布一年多了,但在各大浏览器之中的支持度还不是很理想,在这查看ES6新特性支持度 Chrome的最新版本浏览器大部分已经支持,在Node.js环境上支持度 ...
- C++ VS2012 内存泄露检测
在VS2012中添加部分代码,可以起到检测内存泄露的作用. 今天刚刚收到的解决办法,原理还不是很清楚.先分享出来 1. 头文件中添加以下代码 #ifdef _DEBUG #define DEBUG_C ...
- 【Java每日一题】20161012
package Oct2016; public class Ques1012 { public static void main(String[] args) { System.out.println ...
- ActiveMQ消息队列介绍
ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合 ...
- loadrunner11中java vuser引用jar包
1.创建工程,新建类,HelloWorld.java,代码如下: package com.liuke; public class HelloWorld { public String getHello ...
- GJM : Python简单爬虫入门(二) [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- pymysql 操作数据库
一.简介 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本 其执行语句与sql源码相似 二.使用 ...
- Properties+重温Map+本地计数器
昨天想写一个记账本,发现并不能把项目名称与内容关联起来,于是乎我想到了map,可是又不知道map储存到文件中又怎么读出来,幸好今天遇到了properties Properties是Hashtable的 ...
- jQuery Danmmu Player 弹幕视频
Danmmu Player是基于jQuery的弹幕视频插件.当在看视频的时候,同时发表自己的观点,这样很好的提高用户互动效果.其实也就是在视频界面上做一个滚动展示动画效果,这样的聊天互动视频效果我们叫 ...
- 如何让C#像JavaScript一样编程
JavaScript是一门动态语言,可以动态的给对象添加属性和方法,非常方便.那么有没有一种方式可以让C#也具备动态添加属性和方法的能力,像Javascript一样进行编程? 下面就介绍一个很不错的框 ...