Drawable
这篇笔记是对LayerDrawable的学习。
LayerDrawable
一个LayerDrawable是一个Drawable子类,管理着一组其他drawable对象。每一个在这个组里的drawable对象按照排列的顺序被重叠绘制,其中最后一个在最上面。
实践
tab背景的XML代码:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<layer-list>
<!-- 红色底 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="4dp" android:drawable="@android:color/white" />
</layer-list>
</item>
<item>
<layer-list>
<item>
<color android:color="#E4007F" />
</item>
<item android:bottom="1dp">
<color android:color="@android:color/white" />
</item>
</layer-list>
</item>
</selector>
TextView的背景XML代码
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingMode="stack">
<!-- 阴影 -->
<item
android:left="2dp"
android:top="4dp">
<shape>
<solid android:color="@android:color/darker_gray" />
<corners android:radius="10dp" />
</shape>
</item>
<!-- 前景 -->
<item
android:bottom="4dp"
android:right="2dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
效果图:
TestLayerList.gif创建LayerDrawable的XMl跟节点是layer-list。在Tab背景的XML代码中,我们以selector为跟节点,实际上它本身是一个stateListDrawable,产生的效果是根据radioButton的状态显示不同的样式。每一个item子标签定义了一个layer-list标签,也就是LayerDrawable。在layer-list标签中,其子标签也是item,代表着每一层。这些item组就代表了一组重叠放置的drawable组,每一个item代表着一个drawable。layer-list的字标签item有四个属性:android:left/right/top/bottom分别代表了四个方向上偏移量。
这四个偏移量和控件的margin设置差不多,都是外间距的效果。如何不设置偏移量,前面的图层就完全挡住了后面的图层,从而也看不到后面的图层效果了。
这次实践的效果是在RadioButton下方有一个根据勾选状态来指示的红色光标,所以为了能让第一层的红色背景显示出来,我们给第二层的白色背景bottom偏移量设置值。
总结
- 跟节点不同,如selector和layer-list,item子标签的属性也是不同的。前者设定状态,后者设定各个方向的偏移量。当然有一个共同的属性就是drawable的引用。不过可以不再item属性中设置drawable引用,在item的子标签中含有不同drawable类型的子标签,在这里可以创建你想要类型的drawable。
- 在上篇笔记中我们知道,selector可以作为color资源的跟节点,但是只能有color属性。drawable目录下可用的属性为android:drawable,在color目录下可用的属性为android:color。
- item的子节点可以为任何类型的drawable类标签,除了上面例子中的shape、color、layer-list,也可以是selector,还有其他没讲过的bitmap、clip、scale、inset、transition、rotate、animated-rotate、lever-list等等。
作业
在这次实践中有一个地方解决不了,在layer-list标签中有一个属性paddingMode不知道是什么作用。
网友评论