5. LevelListDrawable

借用Amy_LuLu__的图
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之间的淡入淡出的效果。

借用https://www.jianshu.com/p/ebd7d61b153f的图
<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

借用Amy_LuLu__的图
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,分别表示顶部,底部,右边,左边内凹的大小。