Overview

一个LayerDrawable是一个可以管理一组drawable对象的drawable。在LayerDrawable的drawable资源按照列表的顺序绘制,所以列表的最后一个drawable绘制在最上层。 在xml文件中使用<layer-list>作为根节点来定义LayerDrawable,通过item子节点定义每一层的drawable,layer-list没有属性节点,只包含item子节点。

创建和使用

1.通过xml文件创建 语法:

<?xml version="1.0" encoding="utf-8"?>  
<layer-list  
    xmlns:android="http://schemas.android.com/apk/res/android" >  
    <item  
        android:drawable="@[package:]drawable/drawable_resource"  
        android:id="@[+][package:]id/resource_name"  
        android:top="dimension"  
        android:right="dimension"  
        android:bottom="dimension"  
        android:left="dimension" />  
</layer-list>  

元素: <layer-list>:作为根节点。 包含一个或者多个元素。 <item>:定义一个drawable放置在layer drawable中。

<item>又具有如下属性:

  • android:id 资源ID,为这个item定义的唯一的资源ID,通过View.findViewById() 检索。
  • android:drawable 引用的drawable资源。
  • android:bottom/top/left/right/start/end 设置与相应方向的距离
  • android:gravity 在容器中的对齐方式
  • android:height 该层的高度。默认为图层的固有高度.
  • android:width 该层的宽度。默认为图层的固有宽度.
  • android:paddingBottom/End/Left/Right/Start/Top 设置相应方向的padding
  • android:paddingMode 表示层填充应该如何影响后续层的边界.取值为0:nest 1:stack

另外,在默认的情况下,每个drawable item都会缩放到合适的大小来适应视图。我们可以再<item>节点里加上<bitmap>元素来指定一个drawable,从而避免被缩放。除了<bitmap>元素,item节点里还可以使用<shape>等元素。

<item>
  <bitmap android:src="@drawable/image" android:gravity="center"/>
</item>
<item>
  <shape android:shape="rectangle">
       <solid android:color="#50000000"/>
  </shape>
</item>

2.通过代码创建

	   Drawable[] layers = new Drawable[3];
		layers[0] = getResources().getDrawable(R.drawable.ic_launcher);
		layers[1] = getResources().getDrawable(R.drawable.ic_launcher);
		layers[2] = getResources().getDrawable(R.drawable.ic_launcher);
		LayerDrawable layerDrawable = new LayerDrawable(layers);
		layerDrawable.setLayerInset(1, 10, 10, 0, 0);
		layerDrawable.setLayerInset(2, 20, 20, 0, 0);
		((ImageView) findViewById(R.id.imageview)).setImageDrawable(layerDrawable);   

其中setLayerInset方法原型为public void setLayerInset (int index, int l, int t, int r, int b)第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。

LayerDrawable在开发中的使用频率还是较少的,一般的需求也可以通过Framelayout来实现,所以对于LayerDrawable我们简单的了解即可。