安卓设置控件的阴影效果:图层效果LayerList
图层列表
LayerDrawable 是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。每个可绘制对象由单一 <layer-list> 元素内的 <item> 元素表示。
layer-list 对应的 Java 类为 LayerDrawable。
layer-list 可以作为根节点,也可以作为 selector 中 item 的子节点。layer-list 可以添加多个 item 子节点,每个 item 子节点对应一个 drawable 资源,按照 item 从上到下的顺序叠加在一起,再通过设置每个 item 的偏移量就可以看到阴影等效果了。layer-list 的 item 可以通过下面四个属性设置偏移量:
- android:top 顶部的偏移量
- android:bottom 底部的偏移量
- android:left 左边的偏移量
- android:right 右边的偏移量
这四个偏移量和控件的 margin 设置差不多,都是外间距的效果(都是相对于外层 container 或者父节点的偏移量)。如果不设置偏移量,前面的图层就完全挡住了后面的图层,从而也看不到后面的图层效果了。那么如果偏移量设为负值会怎么样呢?经过验证,偏移超出的部分会被截掉而看不到。
其他:
默认情况下,所有可绘制项都会缩放以适应包含视图的大小。因此,将图像放在图层列表中的不同位置可能会增大视图的大小,并且有些图像会相应地缩放。为避免缩放列表中的项目,请在 <item> 元素内使用 <bitmap> 元素指定可绘制对象,并且对某些不缩放的项目(例如 "center")定义重力。
例如,以下 <item> 定义缩放以适应其容器视图的项目:
<item android:drawable="@drawable/image" />
为避免缩放,以下示例使用重力居中的 <bitmap> 元素:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center" />
</item>
实例:
XML 文件保存在 res/drawable/layers.xml 中:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@drawable/android_red"
android:gravity="center" />
</item>
<item android:top="10dp" android:left="10dp">
<bitmap android:src="@drawable/android_green"
android:gravity="center" />
</item>
<item android:top="20dp" android:left="20dp">
<bitmap android:src="@drawable/android_blue"
android:gravity="center" />
</item>
</layer-list>
请注意,此示例使用嵌套的 <bitmap> 元素为每个具有“中心”重力的项目定义可绘制对象资源。这可确保没有图像会为了适应容器的大小而缩放,因为偏移图像会造成大小调整。
此布局 XML 会将可绘制对象应用到视图
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/layers" />
结果导致一堆不断偏移的图像:
image.png