Ужасное качество фонового изображения в Android - PullRequest
16 голосов
/ 07 декабря 2011

Я пытаюсь разместить фон в своей деятельности, но качество изображения не является ожидаемым.

Изображение имеет простой градиент над синими полосами и в настоящее время выглядит так:

LinearLayout background

Макет моей активности:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/background_register"
    android:drawingCacheQuality="high" >
</LinearLayout>

Дескриптор фона (drawable/background_register):

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:tileMode="repeat"
    android:gravity="center"
    android:src="@drawable/background_blue_565" />

В настоящее время у меня есть файл XML, описывающийBitmapDrawable, который является фоном LinearLayout для Actitivy.Но я перепробовал все, что нашел до сих пор.Включены режимы дизеринга, сглаживания, тайла, RGBA_8888 ... Вы называете это.У кого-нибудь есть другое решение или идея, которую я мог бы попробовать?Я был бы очень признателен.

Кстати, я сейчас разрабатываю приложение для Galaxy S II.

Ответы [ 3 ]

42 голосов
/ 07 декабря 2011

Прежде всего, убедитесь, что ваше исходное изображение выглядит хорошо, чтобы вы не просто получили оттуда проблему.
Затем, в вашем методе onCreate (), выполните:

код1:

getWindow().getDecorView().getBackground().setDither(true);
getWindow().setFormat(PixelFormat.RGBA_8888);

устарел:

getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER);

И чтобы явно загрузить ваше изображение как 32-битное изображение (конфигурация RGBA-8888), добавьте следующее, где вы загружаете свои представления:

code2:

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));


Сравнение между различными подходами: (это все скриншоты из полученного приложения)

Мои исходные изображения (64 цвета слева, 24 бита справа):
image1 и image2:
64-color24 bit
1: необработанное 64-цветное изображение (image1), заданное в качестве фона из макета XML:
Raw image
2: то же изображение(изображение 1), используя code1 :
Dithered image
3: одно и то же изображение (изображение 1) с использованием обоих code1 и code2 :
explicit 32bit
4: изображение2, загруженное с code1 и code2 (в этом случае дизеринг не имеет большого значения, так как источник и назначение используют 8 бит на цвет):
higher original quality

Обратите внимание, что результирующие артефакты на изображении 3 уже существуют на исходном изображении.

Примечание: если кто-нибудь знает, как уменьшитьизображения немного вниз, не стесняйтесь редактировать этот пост ...

5 голосов
/ 07 декабря 2011

Проблема в том, что ваш PNG был преобразован в 256 цветов, откройте APK в выбранном вами ZIP-инструменте и проверьте вручную. Если это так, убедитесь, что ваш PNG имеет:

  1. Альфа-канал
  2. Один пиксель, который слегка прозрачен

Это должно предотвратить его преобразование в индексированную палитру.

0 голосов
/ 07 декабря 2011

это похоже на проблему с изображением для меня. Какие настройки вы сохраняете изображение и формат? Это похоже на артефакты сжатия, откуда я смотрю.

...