我想将具有径向渐变的可绘制形状用作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));