Android 10 手势导航禁用

问题描述 投票:0回答:3

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

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

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

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

android gesture android-orientation gesture-recognition onbackpressed
3个回答
3
投票

记住:

  • 必须在视图的 doOnLayout() 中调用 setSystemGestureExclusionRects()

我的实现:

    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
            }
        }
        
    }
  • 我排除了从顶部开始 150dp 以及整个宽度的手势(只是为了测试)

虽然@Dev4Life的回答很有帮助,但在访问文档之前我没有成功:

Android 文档:setSystemGestureExclusionRects


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

     // '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 以获取后退手势,您可以根据自己的喜好进行更改。

这里有一些注意事项:-

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

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


0
投票

var排除矩形=listOf(矩形1,矩形2,矩形3)

有趣的布局( changeCanvas:布尔值,左:Int,顶部:Int,右:Int,底部:Int){ // 更新矩形边界和排除矩形列表 设置系统手势排除矩形(排除矩形) }

有趣的 onDraw(canvas: Canvas) { // 更新矩形边界和排除矩形列表 设置系统手势排除矩形(排除矩形) }

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.