Я обновляю свое приложение Android OpenGL для запуска на моем новом телефоне 4K и намереваюсь работать в полноэкранном режиме, размеры которого логически и физически 4K.Однако без специального корпуса для 4K я сталкиваюсь с очевидным ожидаемым сценарием, согласно которому моя активность составляет всего 1080p, и я хочу увеличить его до 4K.
Я следил за доступной документацией, касающейся запросоврежимы отображения, которые, к счастью, перечисляют и 1080p, и 4K в качестве доступных режимов отображения.Псевдокод getBestDisplayModeId () ниже представляет этот шаг, который я считаю работающим точно.Можно предположить, что эта функция правильно возвращает идентификатор режима отображения режима отображения 4K.Затем я устанавливаю предпочитаемыйDisplayModeId в LayoutParams для окна на этот оптимальный идентификатор режима отображения и использую setAttributes (), чтобы, надеюсь, применить его к окну.
Это выполняется во время onCreate () для моей полноэкранной операции.Обратите внимание, что действие было создано с помощью мастера полноэкранного действия в Android Studio, и оно по существу содержит только GLSurfaceView и связанный Renderer (типичная настройка OpenGL).
Мой (GL) класс Renderer был временно изменен (для целей отладки)) для отображения Toast (через IPC), показывая его размеры всякий раз, когда вызывается его переопределенный метод onSurfaceChanged ().Тост всегда сообщает, что размеры составляют 1080p, а не предполагаемые 4K.
Как я могу правильно применить предпочитаемыйDisplayModeId и затем получить Activity / View / GLSurfaceView, который действительно является предполагаемым размером 4K?
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
}