禁用平滑调整大小以使Android应用与Windows Subsystem for Android完全兼容

uqdfh47h  于 2022-12-16  发布在  Android
关注(0)|答案(1)|浏览(162)

我的应用需要在布局完成后执行一些视图大小调整。它目前在onWindowFocusChanged()中完成。
它在Windows 11上无法正常工作(使用Windows Subsystem for Android,WSA)。在手动调整窗口大小的过程中,Activity会被销毁并重新创建几次,但:

  • 在调整大小过程中或调整大小之后,从不调用onWindowFocusChanged()
  • 在调整大小结束时不会重新创建“活动”,因此posting a runnable to the UI queue不是一个选项:此时视图的尺寸仍然是错误的。

我注意到切换WSA兼容性设置Disable smooth resize实际上解决了这个问题:在调整大小的过程中什么也不发生,但是当调整大小结束时onWindowFocusChanged()被调用。

是否可以通过编程方式强制执行此行为?

我不希望用户被迫更改此设置才能正常使用应用。

omhiaaxx

omhiaaxx1#

我最终发现这个窗口大小调整问题并不是WSA特有的:当使用可自由调整大小的窗口时,常规Android设备和模拟器也会出现这种情况。
解决方案是停止依赖onWindowFocusChanged()来获得窗口大小更改的通知:这是一个不可靠黑客(见问题)。
相反,我现在使用OnGlobalLayoutListener,如下所示:

myGlobalParentView.getViewTreeObserver()).addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                setDimensionsOfVariableViews();
            }
        });

每次改变窗口大小时,游戏视图都会正确调整大小。setDimensionsOfVariableViews()实现了防止过度调整大小/布局和无限循环的基本保护(检查自上次调用以来大小是否发生了变化),因此我们从不删除侦听器。

相关问题