Java 从Android Q中删除手势

Java 从Android Q中删除手势,java,gesture,android-10.0,Java,Gesture,Android 10.0,我有一个儿童绘图应用程序,但Q中的手势一直在退出该应用程序。我试图删除系统的手势,但似乎不起作用 在这种情况下,我试图从系统手势中排除整个屏幕: List<Rect> exclusionRects = new ArrayList(); public void onLayout(boolean changedCanvas, int left, int top, int right, int bottom) { if (Build.VERSION.SDK_INT >= B

我有一个儿童绘图应用程序,但Q中的手势一直在退出该应用程序。我试图删除系统的手势,但似乎不起作用

在这种情况下,我试图从系统手势中排除整个屏幕:

List<Rect> exclusionRects = new ArrayList();

public void onLayout(boolean changedCanvas, int left, int top, int right, int bottom) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        exclusionRects.clear();
        exclusionRects.add(new Rect(left, top, right, bottom));
        setSystemGestureExclusionRects(exclusionRects);
    }
}
List exclusionRects=new ArrayList();
仅限公共空间布局(布尔值更改canvas、int left、int top、int right、int bottom){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.Q){
排除项。清除();
添加(新的矩形(左、上、右、下));
设置系统管理排除项(排除项);
}
}
如谷歌所述:

首先,为了确保可靠和一致的操作,背部姿势有一个200dp的垂直应用程序排除限制

这意味着操作系统将不允许您完全覆盖后退手势

这是有道理的,因为它是操作系统中相当基本的一部分,他们可能不希望允许应用程序完全删除手势,因为这不利于整个平台的一致性

  • 在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);
     }
    
    • 我们将视图宽度添加到16dp,以在用户从左边缘向右滑动时触发代码&从屏幕高度向右滑动以完全向左滑动

    什么是“200dp垂直应用程序排除限制”?背部姿势不是在左侧(水平)吗?背部姿势在左侧和右侧,这两个都是垂直边(垂直=上下,水平=左右)。这意味着,在整个屏幕高度中,只有200dp可以从手势导航中排除。也就是说,如果您的屏幕高度为1000dp,则无论发生什么情况,手势都将至少使用800dp。此代码适用于整个左边缘,对于下边缘和右边缘,您只需在arraylist中添加矩形,如上文所述。
     // '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);
         }
     });