美文网首页
View绘制流程之Drawable(三)

View绘制流程之Drawable(三)

作者: 狮_子歌歌 | 来源:发表于2016-08-14 16:25 被阅读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

    相关文章

      网友评论

          本文标题:View绘制流程之Drawable(三)

          本文链接:https://www.haomeiwen.com/subject/wibysttx.html