我想将具有径向渐变的可绘制形状用作View的背景。根据javadoc,可以将渐变半径设置为特定值(大概是像素)或百分比:



如果我错了,请纠正我,但是这里使用像素值是完全没有用的,因为从一个屏幕密度到另一个屏幕密度,这种梯度看起来将完全不同(经过测试,是的,这是真的)。我尝试使用%和%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。有道理,但没有任何用处。

那么使用梯度半径的最佳方法是什么?

PS。
我已经使用GradientDrawable以编程方式添加了背景,并且获得了预期的结果。我将GradientDrawable.setGradientRadius()与相对于 View 宽度的值一起使用,并在设备之间获得一致的Gradient。

最佳答案

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

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

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

10-06 03:43