gpt4 book ai didi

android - 阻止整个屏幕的 Android 10+ 向后滑动手势

转载 作者:行者123 更新时间:2023-12-05 00:03:57 24 4
gpt4 key购买 nike

我正在尝试在我的游戏中禁用 Android 10+ 手势导航向后滑动(出于非常正当的原因)。我需要禁用整个屏幕的滑动手势。
谷歌的文档对于如何做到这一点非常含糊。 https://developer.android.com/training/gestures/gesturenav#games
这是我尝试过的。如果我直接在 onCreate 中执行 getWindow().setSystemGestureExclusionRects(exclusionRects) 会导致启动时立即崩溃。我得到的错误是:java.lang.IllegalStateException:未添加 View 。
我的第二次尝试是将 addOnLayoutChangeListener 中的系统手势排除矩形设置为包含在我的根布局中的(唯一) View ,以便手势排除内容仅在 View 正常运行时运行。为了这个例子,假设 initializeForView 是一个返回有效 View 的函数。除了没有被阻止的手势之外,一切都正常。
由于某种原因,我尝试的这段代码仅阻止了屏幕下半部分的向后滑动手势:(

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
game = new Lockjaw(this);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
RelativeLayout layout = new RelativeLayout(this);
layout.setFitsSystemWindows(true);
View view = initializeForView(game, config);
layout.addView(view);
setContentView(layout);
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
int oldTop, int oldRight, int oldBottom) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
List<Rect> exclusionRects = new ArrayList();
Rect visibleRect = new Rect();
v.getWindowVisibleDisplayFrame(visibleRect);
exclusionRects.add(visibleRect);
getWindow().setSystemGestureExclusionRects(exclusionRects);
}
}
});
}

最佳答案

  • 在 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);
    }
  • 检查您的布局是否设置在要排除边缘 getures 的那个 Activity 中,然后应用此代码。
     // '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);
    }
    });
  • 我们将 View 宽度添加到 16dp 以在用户从左边缘和高度向右滑动到屏幕高度以完全左侧完成时触发代码。
  • 关于android - 阻止整个屏幕的 Android 10+ 向后滑动手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65056838/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com