【Android Drawable系列】- 多个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:gravity
:item
也是支持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-rotate
、animated-selector
、animation-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:id
、android:left
、android:top
、android:right
和android:bottom
,用法和之前相同就不说了。
这是drawable资源文件的第三篇文章,到这里基础的就结束了,后续慢慢就开始做一些实际用法。