我正在创建一个径向渐变,如:
<?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指定半径和比例,并在其余的屏幕密度中自动缩放,或者是否需要创建多个可绘制文件?
答案 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" />