在android中的循环渐变

我试图做一个渐变,从屏幕的中间发出白色,并转向黑色,因为它移动到屏幕的边缘。

当我做出这样的“正常”渐变时,我一直在尝试不同的形状:

   

当使用“椭圆形”形状时,我至少有一个圆形,但没有梯度效果。 我怎么能做到这一点?

你可以使用android:type="radial"获得一个循环渐变android:type="radial"

    

我总是在学习新概念时发现图像有帮助,所以这是一个补充答案。

在这里输入图像说明

%p表示父级的百分比,即我们设置的任何视图的最窄维度的百分比。 上面的图片是通过改变这个代码中的gradientRadius生成的

my_gradient_drawable

     

可以像这样设置视图的background属性

  

中央

你可以改变半径的中心

 android:centerX="0.2" android:centerY="0.7" 

其中小数分别是xy的宽度和高度的分数。

在这里输入图像说明

文档

这里有一些从文档中解释一些东西的注意事项。

android:gradientRadius

渐变的半径,仅与径向渐变一起使用。 可能是相对于形状的最小尺寸的显式尺寸或分数值。

可能是一个浮点值,如“1.2”。

可能是一个维度值,这是一个浮点数字,附加一个单位,如“14.5sp”。 可用的单位是:px(像素),dp(密度独立像素),sp(基于首选字体大小的缩放像素),单位为英寸和毫米。

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

我想你应该添加android:centerColor

    

此示例显示从白色到黑色到白色的水平渐变。

   

如果您需要更多的控制,例如多种颜色和定位,您也可以在代码中进行。 这里是我的Kotlin代码片断创建一个可绘制的径向渐变:

 object ShaderUtils { private class RadialShaderFactory(private val colors: IntArray, val positionX: Float, val positionY: Float, val size: Float): ShapeDrawable.ShaderFactory() { override fun resize(width: Int, height: Int): Shader { return RadialGradient( width * positionX, height * positionY, minOf(width, height) * size, colors, null, Shader.TileMode.CLAMP) } } fun radialGradientBackground(vararg colors: Int, positionX: Float = 0.5f, positionY: Float = 0.5f, size: Float = 1.0f): PaintDrawable { val radialGradientBackground = PaintDrawable() radialGradientBackground.shape = RectShape() radialGradientBackground.shaderFactory = RadialShaderFactory(colors, positionX, positionY, size) return radialGradientBackground } } 

基本用法(但随意调整额外的参数):

 view.background = ShaderUtils.radialGradientBackground(Color.TRANSPARENT, BLACK)