Shape Drawable gradientRadius仅适用于像素。这不是没用的吗? %值不起作用

时间:2012-12-21 01:38:13

标签: android android-drawable

我想使用带有径向渐变的shape drawable作为View的背景。根据javadoc,渐变的半径可以设置为特定值(可能是像素)或百分比:

  

机器人:gradientRadius

     

渐变的半径,仅用于径向渐变。

     

可以是浮点值,例如“1.2”。

     

可以是小数值,也就是附加的浮点数   %或%p,例如“14.5%”。 %后缀总是表示a   基数的百分比;可选的%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 ...
}
啊哈哈!因此,所有添加%或%p确实将我的值除以100.(我测试了这一点,因为TypeValue.getFraction()的文档更加不清楚)。 65%变为0.65。有道理,但没有用处。

那么使用gradientRadius的最佳方法是什么?

PS。 我使用GradientDrawable以编程方式添加了我的背景,我得到了理想的结果。我使用GradientDrawable.setGradientRadius()来获取相对于视图宽度的值,并在设备之间获得一致的渐变。

1 个答案:

答案 0 :(得分:2)

要使用所有屏幕尺寸,您必须在dp中设置半径。您可以通过此方法从dp计算px

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

例如,您要设置GradientDrawable.setGradientRadius(pxfromDp(7));