在Android的drawable资源体系中,layer-list是用于实现多图层叠加的核心标签,它允许开发者将多个drawable元素按照声明顺序堆叠,最终组合成一个完整的可绘制资源,广泛应用于自定义控件背景、复杂图形绘制等场景。
layer-list的基本结构
layer-list的根标签是<layer-list>,内部通过<item>标签定义每一个叠加的图层,每个item可以引用已有的drawable资源,也可以直接在内部定义shape、bitmap等drawable类型。
基本语法结构如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 第一个图层,会被后面的图层覆盖 -->
<item>
<shape android:shape="rectangle">
<solid android:color="#FF0000" />
</shape>
</item>
<!-- 第二个图层,会覆盖在第一个图层上方 -->
<item>
<shape android:shape="rectangle">
<solid android:color="#00FF00" />
</shape>
</item>
</layer-list>
图层顺序规则
layer-list中<item>的声明顺序决定了图层的叠加顺序:先声明的item位于底层,后声明的item位于上层,上层图层会覆盖底层图层的重叠区域。这个规则和View的绘制顺序一致,越早声明的元素越早绘制,越晚绘制的元素会盖在上方。
item常用属性配置
每个<item>标签支持以下常用属性,用于控制图层的显示位置和尺寸:
- android:drawable:直接引用已有的drawable资源,引用后item内部无需再定义其他drawable内容
- android:top:图层顶部距离layer-list边界的偏移量,单位dp
- android:bottom:图层底部距离layer-list边界的偏移量,单位dp
- android:left:图层左侧距离layer-list边界的偏移量,单位dp
- android:right:图层右侧距离layer-list边界的偏移量,单位dp
常见使用场景示例
1. 实现带阴影的按钮背景
通过底层灰色图层模拟阴影,上层主色图层偏移一定距离,就能实现常见的阴影效果:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 阴影图层,放在底层 -->
<item
android:bottom="4dp"
android:right="4dp">
<shape android:shape="rectangle">
<solid android:color="#33000000" />
<corners android:radius="8dp" />
</shape>
</item>
<!-- 主背景图层,放在上层 -->
<item
android:left="0dp"
android:top="0dp"
android:right="4dp"
android:bottom="4dp">
<shape android:shape="rectangle">
<solid android:color="#FF5722" />
<corners android:radius="8dp" />
</shape>
</item>
</layer-list>
2. 实现带边框的圆形头像背景
底层用白色圆形作为边框,上层用图片或者圆形色块作为内容区域,就能实现带边框的圆形效果:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 边框图层 -->
<item>
<shape android:shape="oval">
<solid android:color="#FFFFFF" />
<stroke
android:width="2dp"
android:color="#FF9800" />
</shape>
</item>
<!-- 内容图层,向内偏移2dp避免盖住边框 -->
<item
android:top="2dp"
android:bottom="2dp"
android:left="2dp"
android:right="2dp">
<shape android:shape="oval">
<solid android:color="#2196F3" />
</shape>
</item>
</layer-list>
3. 组合渐变和图标
如果需要背景是渐变,同时右上角固定显示一个图标,可以用layer-list组合实现:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 渐变背景图层 -->
<item>
<shape android:shape="rectangle">
<gradient
android:startColor="#FF4081"
android:endColor="#3F51B5"
android:angle="45" />
<corners android:radius="12dp" />
</shape>
</item>
<!-- 右上角图标图层 -->
<item
android:top="8dp"
android:right="8dp"
android:gravity="top|right">
<bitmap
android:src="@drawable/ic_star"
android:gravity="center" />
</item>
</layer-list>
注意事项
- 如果item同时设置了android:drawable属性和内部自定义的drawable,内部自定义的drawable会覆盖引用的资源,不会生效
- item的偏移属性会使得图层的可绘制区域缩小,比如设置android:top="4dp",图层的顶部4dp区域不会被绘制内容
- layer-list本身没有固定尺寸,最终尺寸会由使用它的View的尺寸决定,每个图层的默认尺寸会和layer-list的尺寸一致,除非单独设置了偏移或者drawable本身有固定尺寸
layer-listdrawable_xmlAndroid图层叠加图层顺序修改时间:2026-07-23 02:07:03