SurfaceHolder.setFormat(PixelFormat.RGBA_8888) не работает на некоторых устройствах, а не в других

У меня есть игровое приложение со следующей структурой Views. Сначала у меня есть пустой FrameLayout, например:

FrameLayout game_frame_layout = new FrameLayout(getApplicationContext());

Затем я добавляю к нему два вида:

game_frame_layout.addView(customView);
game_frame_layout.addView(butView);

CustomView предназначен для отображения всех видов движущихся игровых графиков, в то время как butView отображает некоторые ImageButtons поверх движущихся грапий. CustomView - это экземпляр класса CustomView, который расширяет SurfaceView.

CustomView включает следующий код

    void updateView() 
    {
        final SurfaceHolder holder = getHolder();
        holder.setFormat(PixelFormat.RGBA_8888);

        try 
        {
                Canvas canvas = holder.lockCanvas();
                if (canvas != null) 
                {
                    onDraw(canvas);

                    holder.unlockCanvasAndPost(canvas);
                }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

Линия holder.setFormat(PixelFormat.RGBA_8888); является недавним добавлением (см. здесь). Без этой линии моя анимированная графика выглядит в формате со слишком небольшим количеством цветов (по экспериментам я понял, что это "RGB_565" ), поэтому я получаю несколько banding артефакты. Когда я добавил строку setFormat, графика отображается отлично (без полосы) на моей Samsung Galaxy Tab 10.1 (Android 3.1)... но на трех других устройствах: Samsung GT-l9100 (4.1.2), Nexus 7 ME370T 4.4.2 и HTC One X 4.2.2. Я вижу только кнопки, соответствующие butView, на полностью черном фоне. В журналах, в которых произошла сбой программы, нет никаких указаний.

Любые идеи?

Ответы

Ответ 1

Вероятно, не все устройства Android поддерживают формат 32/24 бит, поэтому 565 всегда работает, а 888 может потерпеть неудачу. Вы можете попытаться понять, есть ли проблема с аппаратным ускорением, пытающимся отключить его.

Ответ 2

Задайте формат пикселя перед установкой setContentView():

getWindow().setFormat(PixelFormat.RGBA_8888);

Ответ 3

Что происходит, когда вы меняете заказ, который вы добавляете в game_frame_layout? Сначала выберите butView, а затем customView:

game_frame_layout.addView(butView);
game_frame_layout.addView(customView);

Я предполагаю, что butView не будет видимым, но мне интересно, правильно ли он отображает его содержимое.

Ответ 4

Ваше приложение, похоже, не работает после ICS. ICS увидела основные изменения в графическом отделе, наиболее важным из которых является введение TextureView, которое предназначено для устранения недостатков SurfaceView. Попробуйте расширить TextureView вместо SurfaceView для вашего класса CustomView. Для получения дополнительной информации посетите Android 4.0 Графика и анимация

Ответ 5

Мне интересно, если вы установите прозрачный фон butView.

butView.setBackgroundColor(Color.TRANSPARENT);