径向梯度适用于不同的dpi

时间:2011-12-14 08:47:19

标签: 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>

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

4 个答案:

答案 0 :(得分: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>

<强> RES /值-MDPI / dimens.xml

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

</resources>

<强> RES /值-HDPI / dimens.xml

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

</resources>

您怎么看?

答案 1 :(得分:8)

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

<dimen name="gradient_radius">25dp</dimen>

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

((GradientDrawable) someView.getBackground())
        .setGradientRadius(getResources().getDimension(
            R.dimen.yellowbadge_largeradius));

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

答案 2 :(得分:0)

docs表示您可以将gradientRadius属性指定为float(猜测它将表示px)或指定为分数。

  

可以是小数值,它是附加%或%p的浮点数,例如“14.5%”。 %后缀总是表示基本大小的百分比;可选的%p后缀提供相对于某个父容器的大小。

你试过吗?这样就可以在dp或布局中的任何单位中指定大小,并从此处引用它。但奇怪的是,大多数尺寸都被指定为可绘制xml格式的尺寸。

答案 3 :(得分:-2)

在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" />