Удивительное качество фонового изображения в 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.
Ответы
Ответ 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-color]()
![24 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
это похоже на проблему с изображением. какова настройка, которую вы сохраняете для изображения и формата? Это похоже на артефакты сжатия, откуда я смотрю.