我正在升级我的Android OpenGL应用程序,使其可以在新的4K手机上运行,并打算进行全屏活动,其逻辑和物理尺寸均为4K。但是,没有4K专用外壳,我遇到了明显的预期情况,我的活动大小仅为1080p,我希望将其提高到4K。
我遵循了涉及查询显示模式的可用文档,但值得庆幸的是,它确实将1080p和4K都枚举为可用的显示模式。下面的伪代码getBestDisplayModeId()表示此步骤,我认为此步骤可以正常运行。可以假定此功能正确返回了4K显示模式的显示模式ID。然后,我将LayoutParams中窗口的preferredDisplayModeId设置为该最佳显示模式ID,并使用setAttributes()希望将其应用于窗口。
这是在全屏活动的onCreate()期间执行的。请注意,该活动是通过Android Studio中的全屏活动向导创建的,它实际上仅包含GLSurfaceView和关联的Renderer(典型的OpenGL设置)。
我的(GL)Renderer类被临时修改(出于调试目的)以显示Toast(通过IPC),每当调用其onSurfaceChanged()重写方法时,都会显示其尺寸。 Toast始终报告其尺寸为1080p,而不是预期的4K。
如何正确地应用preferredDisplayModeId,然后获得真正符合预期4K大小的Activity / View / GLSurfaceView?
int getBestDisplayModeId()
{
// 1. query available display modes for display 0 via DisplayManager
// 2. return display mode corresponding to the highest resolution
}
FullscreenActivity.onCreate()
{
Window w = getWindow();
WindowManager.LayoutParams p = w.getAttributes();
p.preferredDisplayModeId = getBestDisplayModeId(); // get 4K id
w.setAttributes(p); // set 4K resolution
// when does the switch to 4K occur?
mGLView = new MyGLSurfaceView();
setContentView(mGLView);
}
MyRenderer.onSurfaceChanged(int w, int h)
{
// only shows 1080p resolution, never 4K
}