View绘制流程之Drawable(三)

2016-08-14  本文已影响78人  狮_子歌歌

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偏移量设置值。

总结

  1. 跟节点不同,如selector和layer-list,item子标签的属性也是不同的。前者设定状态,后者设定各个方向的偏移量。当然有一个共同的属性就是drawable的引用。不过可以不再item属性中设置drawable引用,在item的子标签中含有不同drawable类型的子标签,在这里可以创建你想要类型的drawable。
  2. 在上篇笔记中我们知道,selector可以作为color资源的跟节点,但是只能有color属性。drawable目录下可用的属性为android:drawable,在color目录下可用的属性为android:color。
  3. item的子节点可以为任何类型的drawable类标签,除了上面例子中的shape、color、layer-list,也可以是selector,还有其他没讲过的bitmap、clip、scale、inset、transition、rotate、animated-rotate、lever-list等等。

作业

在这次实践中有一个地方解决不了,在layer-list标签中有一个属性paddingMode不知道是什么作用。

参考

文献1文献2文献3

上一篇下一篇

猜你喜欢

热点阅读