5. LevelListDrawable
LevelListDrawable
对应于<level-list>
标签,它同样表示一个Drawable
集合,集合中的每个Drawable
都有一个等级(level)
的概念。根据不同的等级,LevelListDrawable
会切换为对应的Drawable
。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" android:drawable="@color/colorAccent"/>
<item android:maxLevel="1" android:drawable="@color/colorPrimary"/>
<item android:maxLevel="2" android:drawable="@color/colorPrimaryDark"/>
</level-list>
每个item
表示一个Drawable
,并且有对应的等级范围,由android:minLevel
和android:maxLevel
来指定,在最小值和最大值之间的等级会对应此item
中的Drawable
。
android:background="@drawable/levellistdrawable"
tv = findViewById(R.id.tv);
Drawable drawable = tv.getBackground();
drawable.setLevel(1);
当将它作为View
的背景时,可以通过Drawable
的setLevel()
方法来设置不同的等级,从而切换具体的Drawable
。如果它被用来作为ImageView
的前景Drawable
,那么还可以通过ImageView
的setImageLevel()
方法来切换Drawable
。最后,Drawable
的等级是有范围的,即0~10000
,最小等级是0
,这也是默认值,最大等级是10000
。
<ImageView
android:id="@+id/iv"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/levellistdrawable"/>
iv = findViewById(R.id.iv);
iv.setImageLevel(2);
6. TransitionDrawable
TransitionDrawable
对应于<transition>
标签,它用于实现两个Drawable
之间的淡入淡出的效果。
<item
android:top="10dp"
android:right="10dp"
android:bottom="10dp"
android:left="10dp"
android:drawable="@android:color/holo_green_dark"/>
android:top
,android:right
,android:bottom
,android:left
表示的是Drawable
四周的偏移量。
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_green_dark"/>
<item android:drawable="@android:color/holo_red_dark"/>
</transition>
将上面的TransitionDrawable
设置为View
的背景,当然也可以在ImageView
中直接作为Drawable
来使用。
<TextView
android:id="@+id/tv"
android:layout_width="300dp"
android:layout_height="300dp"
android:text="Hello World!"
android:gravity="center"
android:background="@drawable/transition_drawable" />
最后,通过它的startTransition
和reverseTransition
方法来实现淡入淡出的效果以及它的逆过程。
tv = findViewById(R.id.tv);
TransitionDrawable drawable = (TransitionDrawable) tv.getBackground();
drawable.reverseTransition(3000);
7. insetDrawable
insetDrawable
对应于<inset>
标签,它可以将其他Drawable
内嵌到自己当中,并可以在四周流出一定的间距。当一个View
希望自己的背景比自己的实际区域小的时候,可以采用insetDrawable
来实现,同时我们知道,通过LayerDrawable
也可以实现这种效果。
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:insetTop="20dp"
android:insetRight="20dp"
android:insetBottom="20dp"
android:insetLeft="20dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/holo_green_dark"/>
</shape>
</inset>
android:insetTop
,android:insetRight
,android:insetBottom
,android:insetLeft
,分别表示顶部,底部,右边,左边内凹的大小。