Kindle Fire меняет разрешение экрана в какой-то момент…

Отказ от ответственности: это странная проблема, которая возникает только в Kindle Fire (пока).

Используемые технологии: Android SDK, Eclipse, LibGDX.

У меня есть относительно простое приложение, работающее с LibGDX. Способ работы LibGDX заключается в наличии потока OpenGL, который будет вызывать Create() (один раз), а затем Render(). столько раз, сколько возможно (чтобы вы могли сделать свой рендер…).

Итак, когда вы инициализируете устройство, вызывается ваш метод «Create()», а затем, когда инициализируется поверхность OpenGL (все это происходит автоматически), начинает вызываться ваш Render().

Если контекст OpenGL потерян, уничтожен и т. д., ваш метод Resize(width,height) вызывается LibGDX.

Слишком далеко. Очень хорошо.

Теперь я столкнулся со странной проблемой с Kindle Fire, когда все выглядело на несколько пикселей смещенным или «обрезанным». Kindle Fire имеет «программную панель» в нижней части экрана (20 пикселей), которую нельзя скрыть или пропустить, что «нормально», поскольку на устройстве нет физических кнопок. Ожидается, что вы коснетесь этой мягкой панели и получите большую полосу, чтобы вернуться, вернуться домой и т. Д. Согласно Amazon, эту полосу нельзя удалить. (не на 100% ясно, но никто не нашел способ, не нарушающий правила Amazon). Единственное приложение, которое я видел, которое удаляет это, — это Amazon Video Players только для потокового видео из облака Amazon. Итак, как вы можете видеть, похоже, нет способа «навсегда» скрыть эту панель.

Так что, если полоса есть, ваше реальное состояние экрана — это не аппаратное разрешение 1024x600 (альбомная ориентация), а 1024x580. Поэтому я добавил логирование в свои методы, чтобы увидеть, что происходит, и был удивлен этим… (вспомните методы create(), render() и resize()):

12-23 15:17:04.119: I/myapp(19921): SCREEN HEIGHT AT CREATE(): 600
[snip other unrelated log stuff]
12-23 15:17:04.673: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 600
[snip other unrelated log stuff]
12-23 15:17:04.705: I/myapp(19921): MyApp - Resize() Called.
12-23 15:17:04.705: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 580

Таким образом, экран был «изменен» Kindle Fire «в какой-то момент».

Кто-нибудь сталкивался с чем-то подобным?

Это скриншот (обратите внимание на черную полосу сверху, я ее не добавлял!). Простите за размытость изображения, но это проект клиента и я не могу ничего "раскрывать".

введите здесь описание изображения

Самое интересное начинается, когда иногда полосы не будет, а приложение будет выглядеть следующим образом (опять же, извините за размытость). Обратите внимание, что верхней панели нет…

введите здесь описание изображения

При ближайшем рассмотрении обоих снимков можно сказать, что дна (которое должно быть одинаковым) нет. Kindle делает странные вещи.

Есть идеи?

Ресурсы изначально были упакованы как 1024x600, но мы изменили это (теперь 580) и предположим, что область просмотра теперь 1024x580, но мне интересно, нашел ли кто-нибудь лучший способ справиться с этой чепухой? :)

примечание: у нас есть android:theme="@android:style/Theme.NoTitleBar.Fullscreen" в манифесте. Ничего не делает.

Заранее спасибо.


person Martin Marconcini    schedule 23.12.2011    source источник
comment
Я не могу помочь с самой проблемой Kindle, но метод resize() может быть вызван в любой момент времени и не связан с потерей контекста. На потерю контекста указывает вызов возобновления().   -  person badlogic    schedule 03.01.2012
comment
@badlogic привет, Марио ;) (здесь Гризор). Да, мы ожидаем resize(), но, похоже, это проблема Kindle Fire (сообщается другими). Amazon сделал там что-то нехорошее… :S Спасибо, но   -  person Martin Marconcini    schedule 04.01.2012


Ответы (3)


Kindle fire имеет странное поведение, когда приложение загружается, кажется, что оно «перемещает» экран на 20 пикселей вверх (высота программной панели), поэтому ваше приложение выглядит на несколько пикселей смещенным или обрезанным. Это потому, что когда вы создаете свой GLSurfaceView и устанавливаете свой рендерер дважды вызывает onSurfaceChanged.

Первый раз после вызова onSurfaceCreated со значением разрешения 1024x600 и второй раз после первого вызова onDrawFrame со значением 1024x580.

Решение: вы должны управлять двумя вызовами onSurfaceChanged и изменять размер области просмотра opengl.

    private static boolean appStarted = false;
    ...

    private static class Renderer implements GLSurfaceView.Renderer 
    {
        public void onSurfaceChanged(GL10 gl, int width, int height) 
        {
            if ( !appStarted )
            {
                 //Initialization (Resolution 1024x600)
            }
            else
            {
                 //Second call, screen resolution changed (Resolution 1024x580)
                 //Resize(width,height)
            }   
            appStarted = true;
        }

        public void onDrawFrame(GL10 gl) {
        //Render()
        }

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //Create()
        }
    }
person gergonzalez    schedule 10.02.2012
comment
Я посмотрю на это, спасибо. Когда у меня получится это сделать, я дам вам знать. - person Martin Marconcini; 10.02.2012
comment
Надеюсь, это поможет вам, я использую этот код для решения этой проблемы в своих проектах :) - person gergonzalez; 11.02.2012

Попробуйте использовать это:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Источник: https://developer.amazon.com/help/faq.html?ref_=pe_132830_21362890#KindleFire

person ajma    schedule 03.02.2012

Недавно я столкнулся с этой проблемой, и мне было интересно, нашли ли вы уже решение.

Черная полоса появляется, потому что ваше приложение сообщает, что высота составляет 580 пикселей. OpenGL имеет систему координат, в которой (0,0) находится в левом нижнем углу экрана.

По какой-то причине программная панель Kindle не перемещает EGLSurface вверх на 20 пикселей. Однако изменение размера уменьшает размер на 20 пикселей, оставляя черную полосу. Итак, проблема заключается в расположении EGLSurface. И кажется, что иногда из-за времени перемещение происходит после изменения размера (из-за чего черная полоса исчезает).

person Habba    schedule 11.07.2012
comment
Решение состояло в том, чтобы использовать приведенное выше решение: stackoverflow.com/a/9225218/2684 - person Martin Marconcini; 11.07.2012