圆形背景不变成椭圆的关键是android:width与android:height相等且android:radius设为宽度一半;android:shape必须为"oval";需在ImageView等控件中设置固定宽高。

shape 圆形背景怎么写才不变成椭圆
关键在 android:width 和 android:height 必须相等,且 android:radius 设为宽度的一半。很多开发者只设 android:radius,但忘了约束宽高,结果在不同控件尺寸下被拉伸成椭圆。
-
android:shape="oval"是绘制圆形的唯一合法值,不是"circle"也不是"round" - 如果用在
ImageView或带 padding 的容器里,要确保父容器或自身设置了固定宽高(如layout_width="48dp"),否则 shape 会按最小尺寸渲染 - 别用
android:gradientRadius配合oval——它只对radial渐变生效,且必须配合android:type="radial",否则静默失效
矩形圆角背景的 radius 参数到底控制什么
android:radius 是统一设置四个角的圆角半径;想单独控制某几个角,得用 android:topLeftRadius 这类属性,但注意:它们只在 API 23+ 生效,低版本会被忽略。
- 当同时存在
android:radius和单角 radius 属性时,android:radius会被完全覆盖(不是“兜底”) - 圆角值超过矩形自身宽高一半时,实际渲染仍以「宽/2」或「高/2」为上限,不会溢出
- 如果矩形需要「仅左上+右上圆角」,建议直接用
android:topLeftRadius和android:topRightRadius,并确认最低支持版本
shape 里用 gradient 后颜色显示异常
常见现象是渐变色偏灰、发白,或整个 shape 变成纯色——大概率是漏写了 android:angle 或角度值非法。
-
android:angle必须是 45 的倍数(0、45、90…),否则整个gradient块被丢弃,回退到 solid 颜色 - 线性渐变默认方向是「左→右」(
android:angle="0"),不是「上→下」;想要竖向渐变,得写android:angle="270"(顺时针旋转) - 使用
android:centerX/android:centerY时,值是 0–1 的浮点数,不是 dp;写成"50%"或"0.5"都行,但"50dp"会直接报错
drawable xml shape 在 Android 12+ 上突然不显示阴影或裁剪异常
Android 12 引入了 MaterialShapeDrawable 作为默认背景处理机制,会主动接管所有 shape drawable 的渲染逻辑,尤其影响圆角和裁剪行为。
- 如果控件用了
Widget.Material3.*主题,系统可能忽略你 xml 中的android:radius,转而读取控件自身的shapeAppearanceOverlay - 临时绕过方式:在 shape xml 里加
android:innerRadiusRatio="1"(对 oval)或显式设置android:useLevel="false",可抑制部分自动适配逻辑 - 更稳妥的做法是改用
ShapeableImageView配合ShapeAppearanceModel,xml shape 在新主题下本质已逐步被替代
真正麻烦的是混合使用——比如一个按钮同时设置了 shape xml 和 app:strokeWidth,这时渲染优先级容易冲突,建议选一边彻底用透。










