android四种渐变实现方法

118 阅读2分钟

四种渐变用法:XML 角度、XML start/end 坐标、代码方式 start/end 坐标。代码方式设置 GradientDrawable + Orientation

Android 渐变:LinearGradient 三种写法对比

在 Android 中,线性渐变(LinearGradient)常用来做控件背景或自定义绘制。这里总结三种方式:XML 角度(angle/orientation)、XML startX/startY、代码方式。

  1. XML 写法(angle/orientation)

适合简单渐变,低版本兼容好。

<!-- res/drawable/bg_gradient_angle.xml --> 
<shape 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle">
<gradient 
android:startColor="#FF0000" 
android:endColor="#0000FF" 
android:angle="45" 
android:tileMode="clamp"
/> 
</shape> 

优点

简单直接,直接作为背景使用。

支持颜色数组(Android 24+)。

缺点

无法精确指定起点终点坐标。

灵活性有限。

  1. XML 写法(startX/startY → endX/endY)

要求 Android 11 / API 30+

可以精确控制渐变起点和终点。

<!-- res/drawable/bg_gradient_coords.xml --> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
<gradient 
android:startColor="#FF0000" 
android:endColor="#0000FF" 
android:startX="0" 
android:startY="0" 
android:endX="200" 
android:endY="200" 
android:tileMode="clamp"/> 
</shape> 

优点

可精确控制起点终点坐标。

直接在 XML 写,不用代码。

缺点

仅支持 Android 11+,低版本不兼容。

  1. 代码方式(LinearGradient)(startX/startY → endX/endY)

完全动态控制坐标,可用于动画或动态颜色。

val linearGradient = LinearGradient( 0f, 0f, // startX, startY 
view.width.toFloat(), view.height.toFloat(), // endX, endY 
Color.RED, Color.BLUE, // 起始颜色 → 结束颜色 
Shader.TileMode.CLAMP ) 
val paint = Paint().apply { shader = linearGradient } 
val shapeDrawable = ShapeDrawable(RectShape()).apply { paint.shader = linearGradient } 
view.background = shapeDrawable 

代码方式(LinearGradient)(startX/startY → endX/endY)

完全动态控制坐标,可用于动画或动态颜色。

4.代码写法 GradientDrawable + Orientation

GradientDrawable gd = new GradientDrawable( GradientDrawable.Orientation.TL_BR, // 左上到右下 
new int[]{Color.RED, Color.BLUE} ); 
gd.setShape(GradientDrawable.RECTANGLE); 
view.setBackground(gd);

优点

动态修改渐变坐标和颜色。

可与动画、触摸事件结合。

兼容低版本 Android。

缺点

需要在代码里实现,相比 XML 繁琐。

总结对比

angle/orientation简单直接,低版本兼容好,但无法精确坐标,灵活性低

startX/startY 精确坐标,通过向量坐标决定渐变方向,API 24 才开始支持。

建议

简单背景使用 angle /orientation即可,angle只能是45度整数倍。包括0度。

需要精确控制渐变坐标且只面向 Android 11+,可用start/end。startx,starty, endx,endy 通过向量坐标决定渐变方向,角度更灵活 0-360度。