android: dither = "true" не дизеринг, что не так? - PullRequest
20 голосов
/ 22 января 2011

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

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

Корневым элементом моего макета активности является 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, это можно смягчить, используя определение прокси-образа / выше вместе с указанием android: dither = "true".Это, однако, не имеет абсолютно никакого эффекта.

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

EDIT: здесь загружены источники

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

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

Ответы [ 5 ]

24 голосов
/ 07 апреля 2011

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

3 голосов
/ 23 января 2011

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

getWindow().setFormat(PixelFormat.RGBA_8888); 

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

2 голосов
/ 17 июня 2011

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

Надеюсь, эта помощь

0 голосов
/ 03 мая 2011

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

0 голосов
/ 22 января 2011

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

linearLayout.getBackground (). SetDither (правда).

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

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...