android:topLeftRadius仅在API 21+生效,需搭配android:shape="rectangle"使用,且会被android:radius覆盖;兼容低版本应改用<corners>标签。

android:topLeftRadius 在 API 21+ 才生效
这个属性不是写上就立刻圆角的,它只在 API 21(Android 5.0)及以上版本被系统识别。低于这个版本,android:topLeftRadius 会被完全忽略,左上角保持直角。
常见错误现象:在旧机型或模拟器(如 API 19)上调试时发现圆角没出来,但 XML 看着没错——大概率就是版本问题。
- 必须搭配
android:shape="rectangle"使用,其他 shape 类型(如 oval、line)不支持该属性 - 如果同时设置了
android:radius,它会覆盖所有单角半径(包括android:topLeftRadius),优先级更低 - 想兼容低版本?只能用
layer-list+ 9-patch 或自定义Drawable,XML 原生方案走不通
用 corners 标签替代更稳妥
corners 是标准写法,支持所有 API 版本,且语义清晰。它把四个角的半径统一收口管理,避免单个属性失效带来的迷惑。
使用场景:需要分别控制四角、或确保低至 API 14 都能显示圆角时,必须用这个。
- 写法是:
<corners android:topLeftRadius="8dp" />
- 可以混用:
android:topLeftRadius和android:bottomRightRadius同时存在,互不影响 - 如果只写
android:radius="8dp",四个角会等半径;但一旦用了任何单角属性,android:radius就自动失效 - 单位建议用
dp,别用px,否则在高密度屏上圆角会显得过小
XML 中写错路径或命名导致圆角不渲染
圆角 Drawable 不生效,有时根本不是属性问题,而是资源没被正确引用。比如把 shape 文件放错目录,或名字含大写字母、下划线。
常见错误现象:布局里写了 android:background="@drawable/round_bg",但预览和运行都还是直角——先查文件是否存在、是否拼写一致。
- shape XML 必须放在
res/drawable/目录下,不能放在drawable-v21里(除非你明确只给新系统用) - 文件名只能是小写字母、数字、下划线,且不能以数字开头;
RoundBg.xml或round-bg.xml都会导致编译失败或找不到资源 - 检查是否有同名文件在不同
drawable-xxx文件夹中冲突,AS 有时会静默选用错版本
View 背景圆角被父容器裁剪或遮挡
即使 shape 正确、属性生效,左上角看起来还是“方”的,大概率是 View 自身没撑开,或者父布局做了裁剪。
使用场景:给 TextView 或 CardView 加圆角背景后,边缘被切掉一部分。
- 确认 View 的
padding是否为 0;有 padding 时,圆角区域可能被内容顶出视觉范围 - 父布局如果是
ConstraintLayout且设了app:layout_constrainedHeight="true",可能压缩高度导致圆角不可见 -
CardView默认带cardElevation,阴影会让圆角“浮起来”,但若cardCornerRadius没设,它不会读取 background 的圆角 - 最直接验证方式:临时把背景换成纯色
#f00,看左上角是不是真圆——排除颜色/透明度干扰
android:topLeftRadius 这个属性本身就有硬性版本门槛。










