Kindle Fire меняет разрешение экрана в какой-то момент ... - PullRequest
5 голосов
/ 23 декабря 2011

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

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

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

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

Если контекст OpenGLпотерян, уничтожен и т. д. ваш метод Resize (ширина, высота) вызывается из 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

Итак, экранбыл "изменен" огнем разжигания, "в какой-то момент".

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

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

enter image description here

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

enter image description here

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

Есть идеи?

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

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

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

Ответы [ 3 ]

6 голосов
/ 10 февраля 2012

Kindle fire ведет себя странно, когда приложение загружается, кажется, что оно «сдвигает» экран на 20 пикселей вверх (высота Softbar), поэтому ваше приложение выглядит на несколько пикселей обрезанным или вырезанным.Это потому, что когда вы создаете 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()
        }
    }
1 голос
/ 03 февраля 2012

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

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

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

0 голосов
/ 11 июля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...