startcolor 必须放在 gradient 标签内且与 endcolor 成对使用,十六进制值需含 alpha(如 #ff123456),angle 决定线性渐变起点方向,centercolor 对 linear 无效,颜色不生效多因结构错误或外部透明度干扰。

shape XML 里 startColor 不生效?先看是不是写错了位置
Android 的 shape 渐变必须用 gradient 标签包裹,startColor 是它的属性,不是 shape 的直接子属性。很多人把 startColor 写在 shape 根节点下,XML 能编译过去但完全不生效。
正确结构是:shape → gradient → startColor、endColor 等。漏掉 gradient 这一层,颜色就只是被忽略的无效字段。
-
startColor和endColor必须成对出现在<gradient></gradient>内部 - 如果只写
startColor没写endColor,整个渐变会退化为纯色(取startColor值),但不是你想要的“单色填充”,而是系统兜底行为 - 十六进制颜色值必须带 alpha 通道(如
#FF123456),写成#123456会被当透明色处理(等价于#00123456)
用 android:type="linear" 时,startColor 方向由 angle 决定
线性渐变的 startColor 并不总是在顶部——它从“渐变起点”开始,而起点位置取决于 angle 属性(仅支持 0、90、180、270 四个值)。比如 angle="0" 表示左→右渐变,此时 startColor 在左边,endColor 在右边。
-
angle="0":左→右,startColor在左边缘 -
angle="90":下→上,startColor在底部(注意:不是顶部!) -
angle="180":右→左,startColor在右边缘 -
angle="270":上→下,startColor在顶部 - 其他角度值(如 45)在旧版本 Android 上会被静默忽略,渐变退化为 0°
API 23+ 支持 centerColor,但 startColor 行为没变
有人以为加了 centerColor 就能改变 startColor 的作用范围,其实不是。centerColor 只在 android:type="radial" 或 android:type="sweep" 下有意义;对 linear 类型,它会被完全忽略。
- 即使写了
centerColor,linear渐变仍只有两个端点:startColor和endColor -
radial类型下,startColor是圆心色,endColor是外缘色,centerColor无效(别被名字误导) - 所有颜色属性都不支持引用资源(如
@color/my_blue),必须写死十六进制值
真机上颜色发灰?检查是否被父容器或主题叠加了 alpha
startColor 值本身没问题,但最终显示偏暗,大概率是 View 自身设置了 alpha,或者父布局有 android:background 半透明层,甚至 AppTheme 里 colorSurface 带透明度影响了渲染。
- 用 Layout Inspector 查看目标 View 的实际绘制颜色,确认是否和 XML 里写的值一致
- 临时把父布局背景设为
#FFFFFFFF、View 自身alpha="1.0",排除叠加干扰 - 避免在
shape里用#80xxxxxx模拟半透效果——应该用android:alpha控制整体透明度,否则渐变插值计算会出偏差
渐变颜色最终长什么样,不光看 startColor 写了啥,更要看它在哪种上下文里被画出来。很多“颜色不对”的问题,根子不在 XML,而在谁在用它、怎么用它。










