径向梯度适用于不同的dpi

Add*_*dev 16 java android gradient

我正在创建一个径向渐变,如:

 <?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>
Run Code Online (Sandbox Code Playgroud)

但是在gradientRadius字段中使用sp和dip等值会返回错误.有没有办法为mdpi指定半径和比例,并在其余的屏幕密度中自动缩放,或者是否需要创建多个可绘制文件?

Gre*_*lli 22

那么如果你这样做会怎么样:

RES /抽拉/ 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>
Run Code Online (Sandbox Code Playgroud)

RES /值-MDPI/dimens.xml

<resources ...>
...
<item name="radius" format="float" type="dimen">326</item>
....

</resources>
Run Code Online (Sandbox Code Playgroud)

RES /值-HDPI/dimens.xml

<resources ...>
...
<item name="radius" format="float" type="dimen">200.34</item>
....

</resources>
Run Code Online (Sandbox Code Playgroud)

你怎么看?


Eri*_*Kok 8

老问题,但这个答案在谷歌中排名很高,我认为另一种方法更具可扩展性.不必为每个密度提供维度,而是从XML创建与密度无关的维度:

<dimen name="gradient_radius">25dp</dimen>
Run Code Online (Sandbox Code Playgroud)

由于我们无法将此直接应用于径向渐变XML drawable,因此我们必须从代码中应用:

((GradientDrawable) someView.getBackground())
        .setGradientRadius(getResources().getDimension(
            R.dimen.yellowbadge_largeradius));
Run Code Online (Sandbox Code Playgroud)

这将覆盖该android:gradientRadius字段,因此您可以将其保留为0.但您仍然无法使用(基于屏幕或其他)%维度.我将它应用于我的视图背景(已经设置了渐变可绘制的!),但它当然也适用于ImageView的src元素.