Android: dither = "true" не замалчивает, что не так?

Я пытаюсь заставить андроида сгладить фоновый образ активности - пока что безуспешно. Я не знаю, что случилось.

Это то, что я сделал:

Корневым элементом моего макета активности является LinearLayout:

<LinearLayout android:id="@+id/AbsoluteLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:gravity="center_horizontal"
android:background="@drawable/background_dither">

где я добавил @drawable/background_dither в качестве фонового изображения. Я поместил XML файл "background_dither.xml" в drawable-hdpi со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/backimg"
android:src="@drawable/background"
android:dither="true"
android:antialias="true" />

который ссылается на фактическое изображение background.png в drawable-hdpi. Изображение, которое включает в себя большой цветной градиент, действительно появляется, но с интенсивной цветовой гаммой. Из того, что я узнал из SDK, это можно смягчить, используя определение представления прокси файла /above вместе с указанием android: dither = "true". Это, однако, не имеет никакого эффекта.

Что мне не хватает, чтобы работать сглаживание?

EDIT: Загрузил источники

EDIT2: После того, как ни один из предложенных методов не помог избавиться от цветовой гаммы, прочитав это сообщение в блоге от Ромена Гая, я идея проверить, имеет ли мой фон PNG альфа-канал. Это не так. После добавления одного, андроид, по-видимому, использует RGB8888, как сказано в сообщении, и полоса пропускания (также для 2.2). Все еще интересно, почему другие методы не работали.

EDIT3: нужно убедиться, что PNG имеет не только альфа-канал, но и, по крайней мере, один пиксель с альфа-значением!= FF, в противном случае инструменты сборки андроида снова разделит это растровое изображение на индексированная палитра без альфа-канала.

Ответ 1

В эту проблему тоже попал сегодня, и нашел и использовал ваше решение: Создайте png в фотошопе с набором прозрачности И, имея хотя бы один пиксель, используя альфу. Фактически то, что я сделал, задает слой с непрозрачностью 99%. Не влияет на цвета или что-то еще, и заставить компилятор Android оставить мой png один.

Ответ 2

Попробуйте поставить эту строку

getWindow().setFormat(PixelFormat.RGBA_8888); 

сразу после super.onCreate() и посмотрите, помогает ли он.

Ответ 3

У меня тоже были эти проблемы, я исправил применение функции 9-патча к фоновому изображению.

Надеемся на эту помощь

Ответ 4

Многие люди, имеющие одинаковые проблемы, сообщают, что установка setDither (true) на ваш ресурс в Java-коде работает, когда атрибут XML не работает. В этом случае, если вы можете получить ссылку на свой LinearLayout в методе onCreate, попробуйте

linearLayout.getBackground(). SetDither (истина).

Альтернативой может быть попытка установить другой формат пикселей, как описано здесь:

http://stuffthathappens.com/blog/2010/06/04/android-color-banding/

Удачи!

Ответ 5

В Android 2.2.1 и ниже появляется ошибка, которая приводит к отключению сглаживания, если включена фильтрация. На Android 2.3.3 и 3.0 эта проблема кажется исправленной. Я не уверен, что то же самое может быть верно для антиалиасов, как вы включили.