Android的Drawable
1、Drawable简介
drawable表示的是一种可以在Canvas上进行绘制的抽象概念,它的种类有很多,最常见的颜色和图片都可以是一个Drawable。
熟练掌握各种类型的Drawable可以方便我么做出一些特殊的UI效果,这一点在UI相关的开发工作中尤为重要。
drawable在开发中有着自己的优点:①、它使用简单,比自定义View的成本要低;②、非图片类型的Drawable占用空间较小,这对减小apk的大小很有帮助。
drawable有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的图像效果。在实际开发中,Drawable常被用来作为View的背景,Drawable一般都是通过xml来定义的。
2、Drawable分类
1)、BitmapDrawable:
这几乎是最简单的Drawable,它表示的就是一张图片。在实际开发中,我们可以直接引用原始的图片即可。
2)、ShapeDrawable:
ShapeDrawable是一种很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形。android:shap属性:rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环),默认值时矩形。
<corners>:表示shape的四个角度。只适用于矩形shape
<gradient>:它与<solid>标签是互相排斥的,其中solid表示纯色填充,而gradient表示渐变效果。
<solid>:表示纯色填充
<stroke>:描边
<padding>内边距
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1px"
android:color="@color/color_stroke_challenge_list" />
<solid android:color="@android:color/white" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#ff0000" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="15dp"
android:topLeftRadius="10dp"
android:topRightRadius="15dp" />
</shape>
3)、LayerDrawable
LayerDrawable对应的XML标签是<layer-list>,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。
默认情况下,layer-list中所有的Drawable都会被缩放至View的大小,对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果。Layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果。
代码示例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape>
<corners android:radius="1.5dp" />
<solid android:color="#B4C2D7"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="1.5dp" />
<solid android:color="#F66969"/>
</shape>
</clip>
</item>
</layer-list>
<SeekBar
android:id="@+id/record_seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="100"
android:maxHeight="2.5dp"
android:minHeight="2.5dp"
android:progress="0"
android:thumb="@mipmap/follow_say_seekbar_thumb_drag"
android:progressDrawable="@drawable/follow_say_record_seekbar_style" />
界面效果:
4)、StateListDrawable
StateListDrawable对应于<selector>标签,它也表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StateListDrawable主要用于设置可单击的View的背景,最常见的是Button。
StateListDrawableDrawable在实际开发中应用场景非常多。
系统会根据View当前的状态从selector中选择对应的item,每个item对应着一个具体的Drawable,系统按照从上到下的顺序查找,直至查找到第一条匹配的item。一般来说,默认的item都应该放在selector的最后一条并且不附带任何状态,这样当上面的item都无法匹配View当前状态时,系统就会选择默认的item,因为默认的item不附带状态,所有它可以匹配View的任何状态。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/icon_notification_has_normal" android:state_pressed="false"/>
<item android:drawable="@mipmap/icon_notification_has_press" android:state_pressed="true"/>
</selector>
5)、LevelListDrawable
LevelListDrawable对应于<level-list>标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级(level)的概念。根据不同的等级,levelListDrawable会切换为对应的Drawable。
使用场景:android系统电池状态改变的显示。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="1" android:drawable="@drawable/image1" />
<item android:maxLevel="2" android:drawable="@drawable/image2" />
<item android:maxLevel="3" android:drawable="@drawable/image3" />
<item android:maxLevel="4" android:drawable="@drawable/image4" />
<item android:maxLevel="5" android:drawable="@drawable/image5" />
</level-list>
<ImageView
android:id="@+id/imgView"
android:src="@drawable/level_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
6)、TransitionDrawable
TransitionDrawable对应于<transition>标签,它用于实现两个Drawable之间的淡入淡出效果。
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/shape_drawable_gradient_linear"/>
<item android:drawable="@drawable/shape_drawable_gradient_radius"/>
</transition>
7)、InsetDrawable
InsertDrawable对应于<inset>标签,它表示将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,同时我们也知道,通过LayerDrawable也可以实现这种效果。
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="15dp"
android:insetLeft="15dp"
android:insetRight="15dp"
android:insetTop="15dp" >
<shape android:shape="rectangle" >
<solid android:color="#ff0000" />
</shape>
</inset>
8)、ScaleDrawable
ScaleDrawable对应于<scale>标签,它可以根据自己的等级将指定的Drawable缩放到一定比例。
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/image1"
android:scaleHeight="70%"
android:scaleWidth="70%"
android:scaleGravity="center" />
9)、ClipDrawable
ClipDrawable对应于<clip>标签,它可以根据自己当前的等级来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制。
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="vertical"
android:drawable="@drawable/image1"
android:gravity="bottom" />