Android 无障碍服务监听手势

无障碍服务可以通过监听特定的手势然后代表用户去执行一些操作。这种能力是在 Android API 16 开始支持的。

权限

无障碍服务监听手势需要配置以下内容:

android:canRequestTouchExplorationMode="true"
android:accessibilityFlags="...|flagRequestTouchExplorationMode"

FLAG_REQUEST_TOUCH_EXPLORATION_MODE 请求系统进入触摸探索模式,在这种模式下,在屏幕上移动单个手指就像鼠标悬停在用户界面上一样,系统将会检测在触摸屏上执行的某些手势并通知无障碍服务。在 Android 4.3 (API 18)以后的版本,需要设置 canRequestTouchExplorationMode 为 true ,才可以正常使用该能力。

触摸探索模式的交互类似于 Android 的无障碍模式,与正常的交互逻辑不同,例如滑动变成了双指滑动,点击变成了双指点击。

手势回调

在 Android API 31 及之后的版本,通过 AccessibilityService 中的 onGesture(AccessibilityGestureEvent) 来接收监听到的手势:

public boolean onGesture(@NonNull AccessibilityGestureEvent gestureEvent) {
   if (gestureEvent.getDisplayId() == Display.DEFAULT_DISPLAY) {
       onGesture(gestureEvent.getGestureId());
  }
   return false;
}

而在 Android API 31 之前的版本,需要通过 onGesture(int) 来接收监听到的手势操作:

@Deprecated
protected boolean onGesture(int gestureId) {
   return false;
}

需要注意的是,API 31 及其以上版本,如果 DisplayId = Display.DEFAULT_DISPLAY ,也是走的 onGesture(int)Display.DEFAULT_DISPLAY : 默认的 Display id ,触摸屏是默认显示器。

而上述的内容可以监听到的手势包括:

// 上滑,及后续操作
GESTURE_SWIPE_UP, 
GESTURE_SWIPE_UP_AND_LEFT, 
GESTURE_SWIPE_UP_AND_DOWN, 
GESTURE_SWIPE_UP_AND_RIGHT, 
// 下滑,及后续操作
GESTURE_SWIPE_DOWN, 
GESTURE_SWIPE_DOWN_AND_LEFT, 
GESTURE_SWIPE_DOWN_AND_UP, 
GESTURE_SWIPE_DOWN_AND_RIGHT, 
// 左滑,及后续操作
GESTURE_SWIPE_LEFT, 
GESTURE_SWIPE_LEFT_AND_UP, 
GESTURE_SWIPE_LEFT_AND_RIGHT, 
GESTURE_SWIPE_LEFT_AND_DOWN, 
// 右滑,及后续操作
GESTURE_SWIPE_RIGHT, 
GESTURE_SWIPE_RIGHT_AND_UP, 
GESTURE_SWIPE_RIGHT_AND_LEFT, 
GESTURE_SWIPE_RIGHT_AND_DOWN

获取 MotionEvents

在 API 31 以下版本是无法通过 onGesture 回调接收到手势序列的;在 API 31 及以上版本,可以通过增加 FLAG FLAG_SEND_MOTION_EVENTS 来接收到 MotionEvent 序列。

这里不管是 FLAG_SEND_MOTION_EVENTS 还是 FLAG_REQUEST_TOUCH_EXPLORATION_MODE 都要依赖于 canRequestTouchExplorationMode 为 true ,否则都不起作用。

android:accessibilityFlags="...|flagRequestTouchExplorationMode|flagSendMotionEvents"

进行如上设置后,可以检测到的手势 ID 也增加了:

  • GESTURE_TOUCH_EXPLORATION :探索模式的触摸事件,类似于启用无障碍模式下,悬浮到某个 View 的操作,一般是单指单击触发。
  • GESTURE_PASSTHROUGH :在探索模式下,触发了正常操作,例如滑动屏幕,点击等等,所有正常模式下的交互,都会触发这个类型的事件,例如双指滑动、双指点击。

总结

本来想探索一下正常模式有没有办法能够检测到用户触摸屏幕的行为,结果发现系统提供了一套监听手势的 API ,但这套 API 看起来是给真正需要无障碍能力的用户使用的。


原文始发于微信公众号(八千里路山与海):Android 无障碍服务监听手势

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/60258.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!