android:bottom 在 layer-list 中需配合显式尺寸或 gravity 才生效,否则易被拉伸覆盖;推荐用 inset 包装并设 android:insetBottom,更稳定可靠。

layer-list 中 item 的 android:bottom 不起作用?
android:bottom 是 item 的合法属性,但它只在父容器明确提供“可测量空间”且该 item 本身不撑满时才生效。常见误区是以为它像 margin 一样总能推远底部——实际它只是预留空白区域,若 item 的 drawable 自身高度等于 layer-list 总高度,android:bottom 就完全不可见。
-
android:bottom仅对当前item的 drawable 生效,不影响其他图层 - 它的值是相对于 layer-list 整体边界计算的,不是相对于上一个
item - 若 drawable 是
<shape></shape>且没设android:height,系统可能按父容器尺寸拉伸,导致android:bottom被“吞掉”
怎么让 android:bottom 真正生效
关键:控制 drawable 的尺寸行为,避免自动拉伸覆盖预留空间。
- 给
item内的<shape></shape>显式指定android:height(比如android:height="48dp"),确保它不占满整个 layer-list 高度 - 或者用
android:gravity="bottom"配合android:bottom,把 drawable “钉”在底部再留空 - 如果 layer-list 用在
ImageView且scaleType="centerCrop",android:bottom会被裁剪忽略——换用fitCenter或centerInside
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:bottom="16dp">
<shape android:shape="rectangle">
<solid android:color="#FF5722" />
<size android:height="32dp" /> <!-- 必须写!否则 height=match_parent -->
</shape>
</item>
</layer-list>
替代方案:用 inset 更可靠
inset 是更可控的方式,尤其当你要“从底部缩进一个固定距离”时。
inset直接作用于 drawable 边界,不受父容器 scaleType 或自动拉伸干扰支持单独设置
android:insetBottom,语义清晰,兼容性好(API 1+)它本质是包装一层“内边距”,所以即使 drawable 拉伸,底部空白依然保留
用法:把原
item的 drawable 包一层<inset>注意:不要在同一个
item里既写android:bottom又写android:insetBottom,后者会覆盖前者效果
<item>
<inset
android:insetBottom="16dp">
<shape android:shape="rectangle">
<solid android:color="#4CAF50" />
</shape>
</inset>
</item>
容易被忽略的兼容性细节
不同 Android 版本对 layer-list 布局解析有细微差异,尤其在低版本或定制 ROM 上。
- API 21(Lollipop)之前,
android:gravity在layer-list中支持有限,android:gravity="bottom"可能不生效 - 使用
android:insetBottom时,如果父 view 高度为wrap_content,且所有item都是 inset 包装,最终 layer-list 高度可能变成 0——需至少一个非 inset 项或显式设minHeight -
android:bottom的单位建议统一用dp,避免在 xxhdpi 设备上因 px 计算偏差导致错位
事情说清了就结束。










