TLDR:我需要一种以编程方式禁用 Android 10 手势导航的方法,这样他们从侧面滑动时就不会意外返回
背景故事:Android 10 引入了手势导航,而不是底部的按钮。因此,现在在启用了该功能的 Android 10 设备上,他们可以从屏幕的任意一侧滑动以返回,并从底部滑动以导航到主页或在应用程序之间导航。然而,我正在研究 AR 中的实现,并希望将屏幕锁定为纵向,但允许用户横向显示。
如果用户将手机转为横向,但活动锁定为纵向,则返回手势导航现在是从顶部滑动,这是在全屏应用程序中访问状态栏的常见方法(就是这个),因此如果用户习惯了Android导航,他们会不经意地返回并离开体验。
有人知道如何a)以编程方式禁用Android 10的手势导航(但是用户如何返回/回家?)或b)知道如何仅更改手势方向而不需要您的活动支持风景?
记住:
我的实现:
binding.root.apply { // changing gesture rects for root view
doOnLayout {
// updating exclusion rect
val rects = mutableListOf<Rect>()
rects.add(Rect(0,0,width,(150 * resources.displayMetrics.density).toInt()))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
systemGestureExclusionRects = rects
}
}
}
虽然@Dev4Life的回答很有帮助,但在访问文档之前我没有成功:
以编程方式阻止手势非常容易,但不能对两侧的整个边缘执行此操作。 所以你必须决定要在屏幕的多少部分禁用手势?
这是代码:
在 Utils 类中定义此代码。
static List<Rect> exclusionRects = new ArrayList<>();
public static void updateGestureExclusion(AppCompatActivity activity) {
if (Build.VERSION.SDK_INT < 29) return;
exclusionRects.clear();
Rect rect = new Rect(0, 0, SystemUtil.dpToPx(activity, 16), getScreenHeight(activity));
exclusionRects.add(rect);
activity.findViewById(android.R.id.content).setSystemGestureExclusionRects(exclusionRects);
}
public static int getScreenHeight(AppCompatActivity activity) {
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
return height;
}
public static int dpToPx(Context context, int i) {
return (int) (((float) i) * context.getResources().getDisplayMetrics().density);
}
检查您的布局是否在要排除边缘手势的活动中设置,然后应用此代码。
// 'content' is the root view of your layout xml.
ViewTreeObserver treeObserver = content.getViewTreeObserver();
treeObserver.addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
content.getViewTreeObserver().removeOnGlobalLayoutListener(this);
SystemUtil.updateGestureExclusion(MainHomeActivity.this);
}
});
我们将排除矩形宽度添加到 16dp 以获取后退手势,您可以根据自己的喜好进行更改。
这里有一些注意事项:-
希望这能永久解决您的问题。 :)
var排除矩形=listOf(矩形1,矩形2,矩形3)
有趣的布局( changeCanvas:布尔值,左:Int,顶部:Int,右:Int,底部:Int){ // 更新矩形边界和排除矩形列表 设置系统手势排除矩形(排除矩形) }
有趣的 onDraw(canvas: Canvas) { // 更新矩形边界和排除矩形列表 设置系统手势排除矩形(排除矩形) }