美文网首页Android技术知识Android项目Android开发
【Android Drawable系列】- 多个Drawable

【Android Drawable系列】- 多个Drawable

作者: MrTrying | 来源:发表于2018-12-10 00:03 被阅读5次
    Android Drawable系列

    本文要说明的是可以使用多个drawable的drawble资源标签。

    Layer list

    layer-list可以管理一组drawable的标签,每个drawable都按文件中的顺序绘制,也就是列表中的最后一个会绘制在顶部。在layer-list中每个drawable需要使用<item>表示。

    先来看看例子:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/shape_gradient"
            android:gravity="center"/>
        <item
            android:drawable="@drawable/shape_gradient"
            android:gravity="center"
            android:left="40dp"
            android:top="30dp"/>
        <item
            android:drawable="@drawable/shape_gradient"
            android:gravity="center"
            android:left="80dp"
            android:top="60dp"/>
    </layer-list>
    

    这是实际效果:

    <layer-list>并没有什么属性,直接看看<item>的属性

    <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" />
    
    • android:drawable:属性不用多说了,就是drawable资源的引用
    • android:id:可以为当前的<item>设置资源id,可以通过LayerDrawable.findDrawableByLayerId()获取到对应的drawable对象
    • android:left|top|right|bottom:则是对应当前drawable显示的各个对应边的距离
    • android:gravityitem也是支持gravity的属性的

    获取layer-list中的drawable代码如下:

    final ImageView imageView = findViewById(R.id.image);
    LayerDrawable drawable = (LayerDrawable) imageView.getDrawable();
    Drawable layerDrawable1 = drawable.findDrawableByLayerId(R.id.layer_drawable_1);
    

    另外,<item>是支持双标签使用的,在<item></item>之间也是可以是写drawable进行使用的,例如:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:gravity="center">
            <shape >
                <solid android:color="#000"/>
            </shape>
        </item>
    </layer-list>
    

    State list

    使用不同的drawable来表示不同的状态,也就是我们平常使用的<selector>标签,配合<item>标签组合使用。每个<item>使用属性来表示所对应的状态,在状态变更时,会从上到下遍历<item>的列表,会使用与当前状态匹配的第一个<item>标签中的drawable,并不是最佳匹配。

    首先看看selector有什么属性

    • android:visiable:样式是否可见
    • android:autoMirrored
    • android:constantSize:各个状态所显示的drawable大小是否相同,false表示不同,true表中所有的状态大小相同(以最大的为准)。默认为false
    • android:variablePadding:表示drawable的内边距会根据状态的变化而变化,设置为true时,你必须为不同的状态配置layout,但是通常不建议这么做。选择false时,内边距保持一致,所有状态中最大的内边距。默认为false
    • android:enterFadeDuration:表示样式淡入的时间,毫秒
    • android:exitFadeDuration:表示样式淡出的时间,毫秒

    再来看看都有什么状态,这是compileSdkVersion 28联想出来的代码提示

    • android:state_accelerated:drawable硬件加速的状态
    • android:state_activated:表示View或者parent被激活时设置为true
    • android:state_active:当view或者drawable激活时为true
    • android:state_checkable:表示是否可以选中
    • android:state_drag_can_accept:表示是否可以drag或drop
    • android:state_drag_hovered:表示可以drag或drop的对象,光标是否悬停在该位置
    • android:state_checked:表示是否选中
    • android:state_enabled:表示是否可用
    • android:state_focused:表示非触摸模式下是否获得焦点
    • android:state_hovered:表示光标是否悬停在该位置
    • android:state_pressed:表示是否被按下
    • android:state_selected:表示是否被选中
    • android:state_window_focused:表示当前activity是否获得焦点显示在最前面

    其中还是几个属性并没有找到具体是什么含义,也没有试出来

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/shape_selected"
            android:state_selected="true"/>
        <item
            android:drawable="@drawable/shape_focused"
            android:state_focused="true"/>
        <item
            android:drawable="@drawable/shape_pressed"
            android:state_pressed="true"/>
        <item android:drawable="@drawable/shape_gradient"/>
    </selector>
    

    同样的,在使用<item></item>时可以使用其他的drawable标签,还可以使animated-rotateanimated-selectoranimation-list

    Level list

    用于管理多个备用Drawable的drawable对象,使用setLevel()设置drawable的级别,根据设置的level显示符合在minLevel<= level <= maxLevel的的drawable。

    item的属性

    • android:drawable:Drawable对象
    • android:maxLevel:level最大值,默认为0
    • android:minLevel:level最小值,默认为0
    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/icon"
            android:maxLevel="10"/>
        <item android:drawable="@drawable/shape_gradient"
              android:minLevel="11"
              android:maxLevel="12"/>
    </level-list>
    

    需要在java代码中使用setLevel或者setImageLevel来改变level的值

    如果所设置的level值,在<level-list>的<item>中找不到符合条件的将会显示成空白。显示的顺序是从上到下,符合minLevel<= level <= maxLevel条件的优先显示。

    Transition drawable

    TransitionDrawable是一个可以在两个drawable之间交叉淡出淡入的drawable对象。使用<transition>标签和<item>标签,而<item>标签不能超过两个。可以使用startTransition()开始变换也可以调用reverseTransition()还原.

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/shape_gradient"/>
        <item android:drawable="@drawable/shape_gradient_90"/>
    </transition>
    

    具体java代码

    ImageView imageView = findViewById(R.id.image);
    TransitionDrawable drawable = (TransitionDrawable) imageView.getDrawable();
    drawable.startTransition(300);
    //drawable.reverseTransition(300);
    

    <item>的属性还支持android:idandroid:leftandroid:topandroid:rightandroid:bottom,用法和之前相同就不说了。

    这是drawable资源文件的第三篇文章,到这里基础的就结束了,后续慢慢就开始做一些实际用法。

    相关文章

      网友评论

        本文标题:【Android Drawable系列】- 多个Drawable

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