Shape Drawable gradientRadius работает только в пикселях. Разве это бесполезно? % не работают - программирование
Подтвердить что ты не робот

Shape Drawable gradientRadius работает только в пикселях. Разве это бесполезно? % не работают

Я хочу использовать форму с возможностью рисования с радиальным градиентом в качестве фона для представления. Согласно javadoc, радиус градиента может быть задан как определенное значение (предположительно пикселей) или в процентах:

Android: gradientRadius

Радиус градиента, используемый только с радиальным градиентом.

Может быть значением с плавающей запятой, например "1.2".

Может быть дробное значение, которое является добавленным числом с плавающей запятой с% или% p, например, "14,5%". Суффикс% всегда означает процент от базового размера; дополнительный суффикс% p обеспечивает размер относительно некоторого родительского контейнера.

Исправьте меня, если я ошибаюсь, но использование значения пикселя здесь совершенно бесполезно, так как этот градиент будет полностью отличаться от одной плотности экрана к другой (проверено, и да, это верно). Я пытался использовать значения% и% p, но они вообще не работали.

Я попал в исходный код Android, чтобы посмотреть, как обрабатывается gradientRadius, и нашел это в классе GradientDrawable:

TypedValue tv = a.peekValue(
    com.android.internal.R.styleable.GradientDrawableGradient_gradientRadius);
    if (tv != null) {
        boolean radiusRel = tv.type == TypedValue.TYPE_FRACTION;
        st.mGradientRadius = radiusRel ?
         tv.getFraction(1.0f, 1.0f) : tv.getFloat();
    } else ...
}

Ah HA! Таким образом, все добавление% или% p действительно делит мое значение на 100. (Я проверил это, потому что документация для TypeValue.getFraction() еще более неясна). 65% стали 0,65. Имеет смысл, но не служит никакой полезной цели.

Итак, каков наилучший способ использования gradientRadius?

PS. Я добавил свой фон программно, используя GradientDrawable, и я получаю желаемые результаты. Я использовал GradientDrawable.setGradientRadius() со значением относительно ширины вида и получал согласованный градиент между устройствами.

4b9b3361

Ответ 1

Чтобы работать со всем размером экрана, вы должны установить радиус в dp. Вы можете вычислить px из dp этим методом.

 public float pxfromDp(float dp) {
    return dp * getResources().getDisplayMetrics().density;
}

Итак, например, вы хотите установить GradientDrawable.setGradientRadius(pxfromDp(7));