Ответ 1
Вероятно, не все устройства Android поддерживают формат 32/24 бит, поэтому 565 всегда работает, а 888 может потерпеть неудачу. Вы можете попытаться понять, есть ли проблема с аппаратным ускорением, пытающимся отключить его.
У меня есть игровое приложение со следующей структурой 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, на полностью черном фоне. В журналах, в которых произошла сбой программы, нет никаких указаний.
Любые идеи?
Вероятно, не все устройства Android поддерживают формат 32/24 бит, поэтому 565 всегда работает, а 888 может потерпеть неудачу. Вы можете попытаться понять, есть ли проблема с аппаратным ускорением, пытающимся отключить его.
Задайте формат пикселя перед установкой setContentView():
getWindow().setFormat(PixelFormat.RGBA_8888);
Что происходит, когда вы меняете заказ, который вы добавляете в game_frame_layout
?
Сначала выберите butView, а затем customView:
game_frame_layout.addView(butView);
game_frame_layout.addView(customView);
Я предполагаю, что butView не будет видимым, но мне интересно, правильно ли он отображает его содержимое.
Ваше приложение, похоже, не работает после ICS. ICS увидела основные изменения в графическом отделе, наиболее важным из которых является введение TextureView
, которое предназначено для устранения недостатков SurfaceView
. Попробуйте расширить TextureView
вместо SurfaceView
для вашего класса CustomView
. Для получения дополнительной информации посетите Android 4.0 Графика и анимация
Мне интересно, если вы установите прозрачный фон butView
.
butView.setBackgroundColor(Color.TRANSPARENT);