Радиальный градиент для разных dpi
Я создаю радиальный градиент, например:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="#7faacaFF"
android:endColor="#cfe1edFF"
android:gradientRadius="326"
android:type="radial"/>
</shape>
Но в поле gradientRadius с использованием таких значений, как sp и dip, возвращают ошибку.
Есть ли способ указать радиус и масштаб для mdpi и автоматически масштабировать его в остальной плотности экрана или необходимо создать несколько доступных файлов?
Ответы
Ответ 1
Так что, если вы это сделаете:
Рез/вытяжка/foo.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#7faacaFF"
android:endColor="#cfe1edFF"
android:gradientRadius="@dimen/radius"
android:type="radial"/>
</shape>
RES/значение-MDPI/dimens.xml
<resources ...>
...
<item name="radius" format="float" type="dimen">326</item>
....
</resources>
RES/значение-ИПЧР/dimens.xml
<resources ...>
...
<item name="radius" format="float" type="dimen">200.34</item>
....
</resources>
Как вы думаете?
Ответ 2
Старый вопрос, но этот ответ показывает, что в Google и я полагаю, что альтернативный подход более масштабируемый. Вместо того, чтобы поставлять измерение для каждой плотности, создайте независимый от плотности размер от XML:
<dimen name="gradient_radius">25dp</dimen>
Так как мы не можем применить это непосредственно к XML-чертежу с радиальным градиентом, мы должны применить его из кода:
((GradientDrawable) someView.getBackground())
.setGradientRadius(getResources().getDimension(
R.dimen.yellowbadge_largeradius));
Это переопределяет поле android:gradientRadius
, поэтому вы можете оставить это на 0. Однако вы все равно не можете использовать (на основе экрана или в противном случае) размерность. Я применяю это на фоне моего представления (к которому уже установлен шаблон градиента!), Но он также относится и к элементу sView ImageView.
Ответ 3
docs говорят, что вы можете указать атрибут gradientRadius как float (предполагая, что это будет означать px) или как дробь.
Может быть дробное значение, которое представляет собой число с плавающей запятой, добавленное либо%, либо% p, например "14,5%". Суффикс% всегда означает процент от базового размера; дополнительный суффикс% p предоставляет размер относительно некоторого родительского контейнера.
Вы пробовали это? Это позволило бы указать размер в dp или любом блоке в макете и обратиться к нему здесь. Странно, однако, большинство размеров указаны как размеры в выпадающем формате xml.
Ответ 4
Используйте проценты в поле android: gradientRadius.
Пример:
Для 50% -ного радиуса, установленного на 50000% p
<gradient
android:angle="45"
android:centerX="0.5"
android:centerY="0.5"
android:endColor="#123123"
android:gradientRadius="50000%p"
android:startColor="#456456"
android:type="radial" />