Цветовая гамма только на Android 4.0+
На эмуляторах под управлением Android 4.0 или 4.0.3 я вижу ужасную цветопередачу, от которой я не могу избавиться. На каждой другой версии Android, которую я тестировал, градиенты выглядят гладкими.
У меня есть SurfaceView, который настроен как RGBX_8888, и полоса отсутствует в рендеринговом холсте. Если я вручную сглажу изображение путем наложения шумового рисунка в конце рендеринга, я могу сделать градиенты снова гладкими, хотя, очевидно, ценой производительности, которую я бы предпочел избежать.
Таким образом, полоса пропускания вводится позже. Я могу только предположить, что в 4.0+ мой SurfaceView квантуется до более низкой глубины бит в какой-то момент между его рисованием и отображением, и я могу видеть из захвата экрана, что градиенты набирают 8 значений за раз в каждый канал, предлагая квантование до 555 (не 565).
Я добавил в функцию Activity onCreate следующее, но это не имело значения.
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
Я также попытался поставить выше в onAttachedToWindow(), но изменений не было.
(Я считаю, что RGBA_8888 является форматом окна по умолчанию в любом случае для версии 2.2 и выше, поэтому мало удивляет, что явно установка этого формата не влияет на 4.0 +.)
Что оставляет вопрос, если источником является 8888, а пункт назначения - 8888, что вводит квантование/диапазон и почему оно появляется только на 4.0 +?
Очень озадачительно. Интересно, может ли кто-нибудь пролить свет?
Ответы
Ответ 1
Попробуйте...
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap gradient = BitmapFactory.decodeResource(getResources(), R.drawable.gradient, options);
findViewById(R.id.main).setBackgroundDrawable(new BitmapDrawable(gradient));
Ответ 2
Включение эмулятора "Использовать хост-GPU" устраняет проблемы с цветом для меня, кредит идет на этот ответ fooobar.com/info/402015/...
В моем случае я использовал Android 4.2.2.