Подтвердить что ты не робот

Удивительное качество фонового изображения в Android

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

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

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, который представляет собой actitivy LinearLayout. Но я пробовал все, что нашел. Включено сглаживание, сглаживание, черепица, режимы RGBA_8888... Вы называете это. У кого-нибудь есть другое решение или идея, которую я мог бы попробовать? Я был бы очень благодарен.

Btw, я в настоящее время разрабатываю приложение в Galaxy S II.

4b9b3361

Ответ 1

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

code1:

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

Устаревшие:

.

<ударными > GetWindow() addFlags (WindowManager.LayoutParams.FLAG_DITHER);ударa >

И чтобы загрузить изображение в виде 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: То же изображение (image1), используя code1:
Dithered image
3: То же изображение (image1), использующее как code1, так и code2:
explicit 32bit
4: image2, загруженный code1 и code2 (в этом случае сглаживание не имеет особого значения, так как источник и назначение используют 8 бит на цвет):
higher original quality

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

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

Ответ 2

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

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

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

Ответ 3

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