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

Радиальный градиент для разных 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 и автоматически масштабировать его в остальной плотности экрана или необходимо создать несколько доступных файлов?

4b9b3361

Ответ 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" />