Android触摸模式
Android的TouchMode
触摸模式
当用户使用 方向键 或 轨迹球 操作用户界面时,必须聚焦到可操作项目上(如按钮),以便用户看到将接受输入的对象。 但是,如果设备具有触摸功能且用户开始通过触摸界面与之交互,则不再需要突出显示项目或聚焦到特定视图对象上。 因此,有一种交互模式称为“触摸模式”。
进入触摸模式
对于支持触摸功能的设备,当用户触摸屏幕时,设备会立即进入触摸模式。
退出触摸模式
无论何时,只要用户点击方向键或滚动轨迹球,设备就会退出触摸模式 并 找到一个视图使其获得焦点。 现在,用户可在不触摸屏幕的情况下继续与用户界面交互。
触摸模式状态作用范围
触摸模式状态的范围是整个系统(所有窗口和 Activity)的。调用 isInTouchMode() 来检查设备目前是否处于触摸模式。
监听变化
ViewTreeObserver.OnTouchModeChangeListener
焦点
焦点的状态
isFocusable() 是否能够聚焦
setFocusable() 设置是否能够聚焦 。xml属性 android:focusable
isFocusableInTouchMode() 是否可以在触摸模式中聚焦
setFocusableInTouchMode() 设置 是否可以在触摸模式中聚焦。xml属性 android:focusableInTouchMode
requestFocus() 请求获得焦点
View.OnFocusChangeListener - onFocusChange() 当用户使用导航键或轨迹球导航到或远离项目时,将回调此方法。
焦点的移动
系统会设置一套默认线路
如果需要自定义,可以通过重写以下 XML 属性: nextFocusDown、 nextFocusLeft、 nextFocusRight和 nextFocusUp。
焦点的获得和失去
在非触摸模式下,焦点的移动是靠方向键或者轨迹球之类进行控制
在触摸模式下,被点击的view如果isFocusableInTouchMode()为true的话,并且此view此时并没获得焦点,则获得焦点,不执行onClick事件,如果此时已经获得焦点,则执行onClick事件。如果isFocusableInTouchMode()为false的话,焦点不变,直接执行onClick事件。
监听变化
ViewTreeObserver.OnGlobalFocusChangeListener
一些有用的参考
https://developer.android.com/guide/topics/ui/ui-events.html#TouchMode
http://android-developers.blogspot.jp/2008/12/touch-mode.html
http://www.101apps.co.za/index.php/articles/what-you-should-know-about-android-touch-mode-and-focus.html