6.Android的Drawable
Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,它的种类有很多,最常见的颜色和图片都可以是一个Drawable。在Android的设计中,Drawable是一个抽象类,它是所有Drawable对象的基类,每个具体的Drawable都是它的子类。
Drawable的内部宽/高这个参数比较重要,通过getIntrinsicWidth/getIntrinsicHeight这两个方法可以获取到它们。但是并不是所有的Drawable都有内部宽/高。另外需要注意的是,Drawable的内部宽/高不等同于它的大小,一般来说,Drawable是没有大小概念的,当用作View的背景时,Drawable会被拉伸至View的同等大小。
shape drawable是一种很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形。
<shape
xmlns:android="...."
android:shape=["rectangle" | "oval" | "line" | "ring"]>
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="color"
android:startColor="color"
android:endColor="color"
android:gradientRadius="integer"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size
android:width="integer"
android:height="integer" />
<solid
android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
<shape>
标签创建的drawable,其实体类是GradientDrawable。
<gradient>
标签和<solid>
标签是互相排斥的,solid表示纯色填充,gradient表示渐变效果。
android:angel
渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上。
StateListDrawable对应于<selector>
标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。
LevelListDrawable对应于<level-list>
标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级level的概念。根据不同的等级,LevelListDrawable会切换为对应的Drawable。
<level-list
xmlns:android="..."
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer" />
</level-list>
在最小值和最大值之间的等级会对应此item中的Drawable。Drawable的等级是有范围的,即0~10000,最小等级是0,这也是默认值,最大等级是10000。
TransitionDrawable对应于<transition>
标签,它用于实现两个Drawable之间的淡入淡出效果。将TransitionDrawable设置为View的背景,然后,通过它的startTransition和reverseTransition方法来实现淡入淡出的效果以及它的逆过程。
InsetDrawable对应于<inset>
标签,它可以将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,同时,通过LayerDrawable也可以实现这种效果。
ScaleDrawable对应于<scale>
标签,它可以根据自己的等级level将指定的Drawable缩放到一定比例。
ClipDrawable对应于<clip>
标签,他可以根据自己当前的等级level来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation
和android:gravity
这两个属性来共同控制。
Drawable的实际区域大小可以通过它的getBounds方法来得到,一般来说它和View的尺寸相同。