Android 10 手势导航禁用

kja*_*on2 5 android gesture-recognition gesture android-orientation onbackpressed

TLDR:我需要一种以编程方式禁用 Android 10 手势导航的方法,以便他们在从侧面滑动时不会意外返回

背景故事:Android 10 引入了手势导航,而不是底部的按钮。因此,现在在启用了该功能的 Android 10 设备上,他们可以从屏幕任意一侧滑动以返回,从底部滑动以导航至主页或在应用程序之间导航。然而,我正在研究 AR 中的实现,并希望将屏幕锁定为纵向,但允许用户横向显示。

如果用户将手机转为横向,但活动锁定为纵向,则返回手势导航现在是从顶部滑动,这是在全屏应用程序(就是这个)中访问状态栏的常见方式,因此用户如果他们习惯了 Android 导航,他们会不经意地返回并留下体验。

有谁知道如何a)以编程方式禁用Android 10的手势导航(但用户如何返回/回家?)或b)知道如何仅更改手势方向而不需要您的活动支持横向?

Dev*_*ife 1

以编程方式阻止手势非常容易,但不能对两侧的整个边缘执行此操作。那么您必须决定要在屏幕的多少部分禁用手势?

这是代码:

  • 在您的 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 检查您的布局是否在要排除边缘手势的活动中设置,然后应用此代码。

     // '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);
       }
     });
    
    Run Code Online (Sandbox Code Playgroud)
  • 我们将排除矩形宽度添加到 16dp 以获取后退手势,您可以根据自己的喜好进行更改。

以下是一些需要注意的事项:-

  • 您不得阻挡两侧手势。如果这样做,这将是最糟糕的用户体验。
  • “getScreenHeight(activity)”是矩形的高度,所以如果你想阻止屏幕左侧和上半部分的手势,只需将其替换为 getScreenHeight(activity)/2
  • new Rect() 中的第一个参数是 0,因为我们希望手势位于左侧,如果您想要右侧,则只需输入 -“getScreenWidth(activity) - SystemUtil.dpToPx(activity, 16)”

希望这能永久解决您的问题。:)