Плавный градиент на разных устройствах

В моем приложении у меня есть градиент как drawable, который я использую в качестве фона, и я не хочу, чтобы он выглядел как можно более гладким. После того, как я разобрался и попытался, я придумал следующее. Если вы вызываете только setDither (true), ваш градиент все еще используется, поэтому вам необходимо установить PixelFormat, как этот Window.setFormat(PixelFormat.RGBA_8888). Но с другой стороны G1 не поддерживает RGBA_8888, поэтому его вызов делает градиент еще более уродливым, чем раньше, поэтому Window.setFormat(PixelFormat.RGBA_8888) не будет работать на устройствах, которые его не поддерживают.

Каков правильный способ сгладить мой градиент на всех устройствах, на которых будет работать мое приложение.

PS: я нашел некоторые связанные темы

Как нарисовать гладкий градиент на холсте в Android

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

Ответы

Ответ 1

Откройте свое изображение в Photoshop (или Gimp или Paint.NET или что-то еще) и добавьте небольшое количество шума. Тогда вам не нужно ничего делать в коде.

Ответ 2

Вы можете использовать пользовательскую форму (поместите ее в /drawable/gradient.xml или что-то в этом роде):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
    android:startColor="#000000"
    android:endColor="#ffffff"
    android:angle="90"/>
</shape>

Таким образом, он будет окрашен os, и он должен быть совершенно гладким.

Ответ 3

При загрузке изображения установите для параметра pixelFormat значение RGB_565 и setDither значение true, если вы рисуете его прямо на экране без каких-либо изменений.

Дисплеи обычно не являются 24-битными, что обычно должно делать это достаточно хорошо, по крайней мере, довольно последовательно.

Вам не нужно использовать 8888, если вам не нужна альфа и не будет изменять данные изображения. Он отобразится на 99% мобильных дисплеев как 16-битный цвет, а не 24 бит, так как это поддержка панелей.

N1 всегда будет иметь проблемы, потому что матрица, которую они используют для панели, имеет двойное зеленое разрешение.

Ответ 4

Если настройка сглаживания и RGBA_888 не помогает на некоторых телефонах, решение может состоять в том, чтобы установить элемент layerType на software, чтобы отключить аппаратное ускорение

android:layerType="software"

Это устранило мою проблему на телефоне Samsung S5.