TouchMode 101
2019-06-13 本文已影响5人
陈蒙_
1. 啥是 TouchMode
现在的智能设备,包括智能手机、平板电脑、智能电视等,可以有多种交互/输入方式,常见的方式有触屏、蓝牙外接键盘、外接手柄、遥控器等。其中触屏方式就是 TouchMode。
2. 为啥要有 TouchMode
说道交互,就绕不开一个东东:焦点。焦点是一种状态,标志当前正在接收用户输入动作。常见的有输入框控件中的光标闪动、按钮高等。特别是在智能电视上,需要通过焦点来实时告诉用户即将接收点击事件的目标控件。而触屏方式下,比如按钮,是不需要焦点的。即,同一个控件,在不同的交互方式下,需要展示不同的状态。显然,为了实现这一点,安卓系统需要感知到当前的交互方式是触屏还是键盘等。于是就产生了 TouchMode,用于表征当前系统的输入方式为触屏模式。
注意,外接键盘和屏幕上的软键盘是两种不同的交互方式,前者不是 TouchMode,而后者属于 TouchMode。
3. 何时使用 TouchMode
TouchMode 是由系统控制的。当用户使用触屏时,比如滑动、点击等操作,系统就进入 TouchMode;当用户使用外接键盘时,比如点击方向键时,系统就离开 TouchMode。
4. 如何使用 TouchMode
- TouchMode 是跨 Activity 的,即 TouchMode 是系统属性,不存在某个 Activity 处于 TouchMode 而其他 Activity 处于非 TouchMode 的情况,可以通过
View#isInTouchMode()
方法判断当前系统是否处于 TouchMode; - 当控件拥有 focus 的时候,click 事件才会被执行;
- 设备进入 TouchMode 后,控件之前的 selection 和 focus 状态会被清除,比如,Item 全是 TextView 的 RecyclerView,当在非 TouchMode 下点击方向键时,会从屏幕上第一项开始选中 item,当进入 TouchMode 后这些选中状态都会被清除;
-
View#setFocusable(false)
会导致View#setFocusableInTouchMode(false)
; -
View#setFocusableInTouchMode(true)
会导致View#setFocusable(true)
; - TouchMode 模式下,默认情况下,只有
EditText#isFocusableInTouchMode() = true
,其他控件是 false;