Android技术知识Android项目Android开发

【Android Drawable系列】- 多个Drawable

2018-12-10  本文已影响5人  MrTrying
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" />

获取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有什么属性

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

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

<?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的属性

<?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资源文件的第三篇文章,到这里基础的就结束了,后续慢慢就开始做一些实际用法。

上一篇下一篇

猜你喜欢

热点阅读