四种渐变用法:XML 角度、XML start/end 坐标、代码方式 start/end 坐标。代码方式设置 GradientDrawable + Orientation
Android 渐变:LinearGradient 三种写法对比
在 Android 中,线性渐变(LinearGradient)常用来做控件背景或自定义绘制。这里总结三种方式:XML 角度(angle/orientation)、XML startX/startY、代码方式。
- 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+)。
缺点
无法精确指定起点终点坐标。
灵活性有限。
- 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+,低版本不兼容。
- 代码方式(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度。