概念
layer-list 是图层列表,原理是列表中的每个可绘制对象均按照列表顺序绘制,列表中的最后一个可绘制对象绘于顶部,图层一层层的叠加,有点类似FrameLayout。在 layer-list 中可以通过控制后添加图层距离最底部图层的左、上、右、下的四个边距等属性,来得到不同的显示效果。
layer-list 是用来创建 LayerDrawable 的,LayerDrawable 是drawable 的一种。
基本使用方法以及注意项
每个可绘制对象由单一 <layer-list> 元素内的 <item> 元素表示。<layer-list>必须是根元素。包含一个或多个 <item> 元素。
layer-list和item标签是固定的,item标签内部可以是如下这些标签:
![](https://img.haomeiwen.com/i6331545/44487d3e84c87584.png)
默认情况下,所有可绘制项都会缩放以适应包含视图的大小。因此,将图像放在图层列表中的不同位置可能会增大视图的大小,并且有些图像会相应地缩放。为避免缩放列表中的项目,请在 <item> 元素内使用 <bitmap> 元素指定可绘制对象,并且对某些不缩放的项目(例如 "center")定义重力。
例如,以下 <item> 定义缩放以适应其容器视图的项目:
<item android:drawable="@drawable/image" />
为避免缩放,以下示例使用重力居中的 <bitmap> 元素:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center" />
</item>
几个应用案例
(1)阴影
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--阴影层-->
<item android:top="6dp"
android:left="3dp">
<shape android:shape="rectangle">
<solid android:color="#b4b5b6"/>
<corners android:radius="5dp"/>
</shape>
</item>
<!--白色层-->
<item android:right="3dp"
android:bottom="6dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
<corners android:radius="5dp"/>
</shape>
</item>
</layer-list>
效果如图所示:
![](https://img.haomeiwen.com/i6331545/6dd597c42e1bc05b.jpg)
项目中长按一条数据可以拖动时浮现阴影有使用过这个功能。
(2)旋转
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<rotate android:fromDegrees="-10" android:pivotX="50%" android:pivotY="50%">
<shape>
<solid
android:color="@android:color/holo_blue_dark"/>
<size
android:width="300dp"
android:height="100dp"/>
<corners
android:radius="10dp"/>
</shape>
</rotate>
</item>
<item>
<rotate android:fromDegrees="10" android:pivotX="50%" android:pivotY="50%">
<shape>
<solid
android:color="@android:color/holo_green_dark"/>
<size
android:width="300dp"
android:height="100dp"/>
<corners
android:radius="10dp"/>
</shape>
</rotate>
</item>
<item>
<rotate android:fromDegrees="30" android:pivotX="50%" android:pivotY="50%">
<shape>
<solid
android:color="@android:color/holo_orange_dark"/>
<size
android:width="300dp"
android:height="100dp"/>
<corners
android:radius="10dp"/>
</shape>
</rotate>
</item>
</layer-list>
效果如图所示:
![](https://img.haomeiwen.com/i6331545/1cfa13a85eb02511.jpg)
(3)两端圆角的进度条
<ProgressBar
android:id="@+id/progress_quality"
android:layout_width="121dp"
android:layout_height="13dp"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
android:progressDrawable="@drawable/shop_percent_bar"/>
重点在progressDrawable,如果我们使用如下实现:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="#f7f7f7"/>
<corners
android:radius="10dp"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle">
<gradient android:type="linear"
android:startColor="#fff3d432"
android:endColor="#ffe0761f"
android:angle="0" />
<corners
android:radius="10dp"/>
</shape>
</clip>
</item>
</layer-list>
实现效果如下所示:
![](https://img.haomeiwen.com/i6331545/293bb363e359a190.jpg)
当值不到100%时,进度条由clip来做会将进度条截断成直角。
我们换一种实现方式,采用scale标签来做,如下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="#f7f7f7"/>
<corners
android:radius="10dp"/>
</shape>
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape android:shape="rectangle">
<gradient android:type="linear"
android:startColor="#fff3d432"
android:endColor="#ffe0761f"
android:angle="0" />
<corners
android:radius="10dp"/>
</shape>
</scale>
</item>
</layer-list>
实现效果如下图所示:
![](https://img.haomeiwen.com/i6331545/88599748de3873d0.jpg)
注意使用scale标签需要添加android:scaleWidth="100%"这个属性,否则设置进度就不起作用了。
(4)App启动页的适配
为了用一套图来适配不同分辨率机型的启动页不被拉伸,我们采用layer-list来实现,纯色背景最佳。启动页的小图标单切。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_bg_color"/>
<item
android:gravity="center"
android:bottom="90dp">
<bitmap android:src="@mipmap/splash_center_logo"/>
</item>
<item
android:bottom="60dp"
android:gravity="bottom|center">
<bitmap
android:antialias="true"
android:gravity="center|bottom"
android:src="@mipmap/splash_bottom_logo" />
</item>
</layer-list>
注意:不打算让图片充满容器要给图片bitmap设置gravity,否则默认会充满容器。
设置activity的主题,并在配置清单文件中给activity设置此主题
<style name="AppSplash" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@drawable/splash_pic</item>
<item name="android:background">@null</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
这个效果图不贴了,反正就是正常的启动页。
启动页适配相关文章:
Android:启动页--最佳实践
Android启动页解决攻略最终版
网友评论