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

Можно ли сгладить градиент?

Я использую следующую возможность:

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <gradient 
        android:startColor="@color/content_background_gradient_start"
        android:endColor="@color/content_background_gradient_end" 
        android:angle="270"
        />

</shape>

Проблема заключается в том, что я получаю строгую привязку к устройствам hdpi (например, Nexus One и Droid), так как градиент переходит от верхней части экрана к самому дну.

Согласно http://idunnolol.com/android/drawables.html#shape_gradient, для градиента нет атрибута "сглаживание". Можно ли что-то сделать, чтобы сгладить градиент?

Примечание: добавление dither = "true" в форму не работает.

4b9b3361

Ответ 1

Я написал документацию, на которую вы ссылались. Я еще раз посмотрел на код и, к сожалению, не удалось включить сглаживание в GradientDrawable, за исключением того, что явным образом вызывал GradientDrawable.setDither() в коде.

(То, как выглядят коды, технически вы можете включить Gradient как единственный дочерний элемент <selector> и включить сглаживание всего селектора, однако это определенно взломать.)

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

Ответ 2

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

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

Это работает для меня, но проблема в том, что все окна затухают. Я искал способ сгладить только градиент, но я ничего не мог найти. android: dither = "true" в xml не работает, а GradientDrawable.setDither(true) также не работает. Итак, любые идеи, как я могу сглазить только градиент?

Ответ 3

В прошлом году я столкнулся с очень похожими проблемами и не нашел полезного вывода в списке разработчиков Android.

Однако некоторое время назад я обнаружил — после попытки <gradient> и всех видов Drawable с различными атрибутами dither и вручную создающими смятые PNGs — что если я вручную создаю новое изображение, используя GIMP, а укажите плотность в этой точке (т.е. явно ввод 120, или 240 и т.д.) при создании изображения, он отлично смотрится даже на устройствах hdpi. И это несмотря на то, что это градиент градации серого, с не так много цветов.

PNG при сохранении заканчивается сравнительно большим (по крайней мере, для 240 точек на дюйм), но выглядит отлично.