gradientradius仅对radial渐变生效,linear和sweep类型下被静默忽略;必须与centerx/centery配合使用,单位为px,不支持dp或资源引用,且需根据view尺寸合理设置以保证视觉效果。

gradientRadius 只对 radial 渐变生效,其他类型设了也无效
很多人在写 sweep 或 linear 渐变时顺手加了 android:gradientRadius,结果发现完全没反应——这不是 bug,是设计如此。gradientRadius 是径向渐变(radial)的专属属性,线性、扫描两种渐变压根不读它。
- 设了
android:type="linear"却配gradientRadius:XML 不报错,但属性被静默忽略 - 设了
android:type="radial"却漏掉gradientRadius:渐变不会渲染,View 背景可能显示为纯色或透明(取决于是否定义solid) - 单位必须是像素(
px),用dp会编译失败(报ResourceType: Expected color or resource, but got '200dp')
radial 渐变必须同时指定 centerXY 和 gradientRadius 才能显示
径向渐变不像线性那样“默认就有方向”,它需要明确“从哪发散”和“散多远”。只设 centerX/centerY 不够,没半径就等于没画布。
-
android:centerX="0.5"和android:centerY="0.5"表示中心在 View 宽高各 50% 处(即正中心),值范围是0.0–1.0,不是百分比字符串 -
android:gradientRadius="300"中的300是绝对像素,不是相对尺寸;若 View 实际宽高小于该值,渐变会裁剪,边缘可能出现硬边或色块断裂 - 如果 View 尺寸动态变化(比如
wrap_content的TextView),固定gradientRadius容易导致渐变溢出或过小,此时建议改用android:useLevel="false"并搭配scaledrawable,但复杂度上升
gradientRadius 值太小或太大都会破坏视觉效果
半径不是越大越好,也不是越小越精致。它直接决定颜色过渡的“呼吸感”和焦点集中度。
- 设成
50:渐变集中在很小一块区域,周围大片纯色,像贴了个色斑 - 设成
2000:在中小尺寸 View 上几乎看不出径向感,接近线性渐变,还可能因计算开销轻微影响绘制性能(尤其低端机) - 推荐起始值:取 View 预期最大宽度/高度的 1.2–1.5 倍(例如按钮宽高约 120dp → 换算为 ~180px,设
gradientRadius="200"较稳妥)
XML 中 gradientRadius 不能用引用,只能写死数值
你不能写 android:gradientRadius="@dimen/radial_radius",系统会直接报错:error: attribute 'android:gradientRadius' not found。这是 Android 资源解析器的硬限制,不是 IDE 误报。
- 所有
gradient下的数值型属性(angle、gradientRadius、centerX等)都只接受字面量,不支持资源引用 - 如果项目需多处复用同一半径,只能靠构建脚本替换或手动维护,没有 XML 层面的变量机制
- 注意:Kotlin/Java 中通过
GradientDrawable动态设置半径则无此限制,setGradientRadius(int)可传变量或计算值
gradientRadius 和 View 实际尺寸的匹配关系——它不像颜色或圆角那样“所见即所得”,得真机预览+不同屏幕密度下验证,否则上线后才发现渐变在某些机型上缩成一个小点。










