layer-list无法直接使用android:shadow实现阴影,需用三层shape(深灰shadow层、浅灰offset层、纯白content层)通过偏移与透明度模拟;适配深色模式应避免硬编码颜色,改用@color/shadow_color并在values-night中定义;elevation更简单但仅限API 21+且需clipChildren="false"。

layer-list 里 shadow 不能靠 android:shadow 实现
Android 的 layer-list 本身不支持 android:shadowRadius 或类似属性——那些只在 TextView 等控件上生效。想用 XML 给卡片加阴影,本质是「模拟」:用多层 shape 偏移 + 透明度渐变来骗过人眼。
正确做法:深色底层 + 浅色偏移层 + 内容层三层叠加
核心思路是三层:shadow(深灰+透明)、offset(浅灰+偏移)、content(纯白/背景色)。关键不是颜色深浅,而是「偏移量」和「透明度」配合产生立体感。
常见错误现象:
• 阴影发虚、边缘模糊不清 → shape 的 android:radius 和 size 没对齐
• 阴影位置不对(比如往上飘)→ android:top/android:bottom 值设反了
• 在低端机上阴影变黑块 → 用了 alpha 值太低(如 0.05),建议不低于 0.12
-
shadow层:深灰(#1A000000),android:top="2dp"、android:bottom="4dp" -
offset层:浅灰(#33000000),android:top="1dp"、android:bottom="2dp",且比 shadow 小 1dp 宽高 -
content层:纯白(#FFFFFF),无偏移,最顶层
适配深色模式时阴影会消失?检查 color 和 alpha 是否硬编码
如果 app 支持深色主题,直接写死 #1A000000 在深色背景下就看不见了。更稳妥的方式是用 @color/shadow_color,并在 values-night/colors.xml 中定义为 #33FFFFFF(浅色文字底下的阴影需反向:白底灰影 → 黑底浅白影)。
性能影响很小,但注意:
• 每多一层 shape 就多一次绘制,别堆到 5 层以上
• 不要用 gradient 模拟阴影,渲染开销大,且在 Android 7.0 以下有兼容问题
替代方案:用 elevation 更简单,但不适用于所有场景
android:elevation="4dp" 是系统级阴影,自动适配、性能好、支持动画。但它只在 API 21+ 生效,且依赖父容器开启 clipChildren="false",否则阴影被裁掉。
所以真正要用 XML layer-list 的场景其实很具体:
• 需要兼容 API 16+
• 要放在 ScrollView 里滚动时保持阴影完整(elevation 在滚动中容易闪烁或错位)
• 需要自定义阴影角度(比如右下角强化、左侧弱化)
这些细节一旦漏掉,比如忘了给父布局加 android:clipChildren="false",阴影就会半截消失——不是代码错了,是容器把它剪掉了。










