android:gradienttype仅支持linear、radial、sweep三个全小写常量,必须置于标签内;linear默认,需startx/endx等;radial须配centerx/centery/gradientradius(推荐100%);sweep仅认centerx/centery,api23+才可靠。

android:gradientType 在 里到底支持哪些值
只支持三个常量:linear、radial、sweep,没有 none 或 repeating。写错会直接导致 XML 解析失败,App 启动时抛出 org.xmlpull.v1.XmlPullParserException,错误信息里通常带 “invalid gradient type”。
这三个值必须全小写,且只能出现在 <gradient></gradient> 标签内,不能放在 <shape></shape> 根标签上。常见误写是拼成 Linear 或 LINEAR,Android 不认大小写变体。
-
linear:默认值,不写也按线性处理;需配合android:startX/android:startY和android:endX/android:endY -
radial:必须指定android:centerX、android:centerY和android:gradientRadius,否则运行时崩溃(Resources$NotFoundException或空指针) -
sweep:只认android:centerX和android:centerY,gradientRadius无效,也不支持起点/终点坐标
radial 渐变为什么总显示成一个色块
大概率是 android:gradientRadius 设得太小,或者单位没写对。这个值是像素(px)或密度无关像素(dp),但 XML 里不写单位会默认为 px —— 在高密度屏上,比如设成 50,实际半径可能不到 0.1 寸,肉眼就看不出来渐变过渡。
更隐蔽的问题是:如果 android:gradientRadius 超过视图尺寸(比如 View 宽高都是 100dp,却设了 200dp),系统不会裁剪,而是让渐变溢出,结果中心区域反而接近纯色。
- 安全做法:用
android:gradientRadius="100%"(注意带百分号),它会按当前 shape 的最小边长的 100% 计算半径 - 不要用
100这种裸数字,统一写成100dp或100% -
android:centerX和android:centerY默认是50%,但显式写出更可控,避免被父级 scale 或 RTL 影响
sweep 渐变在 API 23+ 才真正可靠
API 21–22(Lollipop 初期)对 sweep 支持有 bug:角度计算异常,经常出现断层或方向反向。即使 XML 写对,不同机型渲染效果也可能不一致,尤其在 android:useLevel="true" 的 Drawable 状态下。
如果你需要兼容到 API 21,别依赖 sweep 做核心视觉;要么降级为两个色块拼接,要么改用 Canvas.drawArc() 手动画。
- API 23+ 可放心用,但注意
android:type="sweep"不支持android:angle属性,旋转得靠android:rotation整体转 Drawable - 所有 sweep 渐变都从正右方(0°)开始逆时针扫,没法改起始角
- 如果用在
ProgressBar的progressDrawable上,确保android:useLevel="true",否则 sweep 不随进度更新
gradient 的颜色停靠点怎么控制过渡节奏
靠 android:positions 数组,但它不是 CSS 那样的百分比列表,而是一个用英文逗号分隔的浮点数序列,每个值范围是 0.0 到 1.0,对应渐变全程的位置比例。
漏掉这个属性,系统会等距分配;写错格式(比如多逗号、空格、超出范围)会导致整个 gradient 失效,回退为单色填充。
- 示例:要实现“70% 是蓝色,剩下 30% 从蓝匀速过渡到红”,写成
android:positions="0.0,0.7,1.0",对应三色android:colors="#00f,#00f,#f00" - 颜色数和 position 数必须严格相等,少一个就会 crash
- position 值不能重复(如
"0.0,0.0,1.0"),否则某些旧版本会解析失败










