Drawable有很多种,它们表示一种图像概念,但它们不全是图片。Drawable是什么呢?下面是Google Android API中的定义:
A Drawable is a general abstraction for “something that can be drawn.” Most often you will deal with Drawable as the type of resource retrieved for drawing things to the screen; the Drawable class provides a generic API for dealing with an underlying visual resource that may take a variety of forms. Unlike a View, a Drawable does not have any facility to receive events or otherwise interact with the user.
它大致的意思是:Drawable一种图像概念。通常,你会把它当成一种能够在屏幕上显示的资源类型来处理,Drawable类提供了一个通用的API来处理不同形式的图像资源。与View不同,Drawable不能接受事件,也不能和用户交互。
下面介绍几种Drawable
BitmapDrawable
BitmapDrawable几乎是最简单的了,它表示一张图片。通常在开发中我们就直接引用图片即可,比如: R.drawable.image(drawable目录下有一个image.jpg或者image.png的图片资源),但是我们也可以用xml来描述Drawable。xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <bitmap xmlns:android="http://schemas.android.com/apk/res/android" 3 android:src="@mipmap/ic_launcher" 4 android:antialias="true|false" 5 android:dither="true|false" 6 android:filter="true|false" android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal|fill_horizontal|center|fill|clip_vertical|clip_horizontal" 7 android:mipMap="true|false" 8 android:tileMode="disabled|clamp|repeat|mirror"/>
ShapeDrawable
这是一种很常见的Drawable,通常是通过编写xml文件来创建的,因此有些复杂。ShapeDrawable通常是通过颜色来构建图形的,既可以是纯色,也可以具有渐变效果。使用大致如下所示:
1 <?xml version="1.0" encoding="utf-8"?> 2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 android:shape="rectangle|oval|line|ring"> 4 <corners 5 android:bottomLeftRadius="integer" 6 android:bottomRightRadius="integer" 7 android:radius="integer" 8 android:topLeftRadius="integer" 9 android:topRightRadius="integer" /> 10 <gradient 11 android:angle="integer" 12 android:centerColor="integer" 13 android:centerX="integer" 14 android:centerY="integer" 15 android:endColor="color" 16 android:gradientRadius="integer" 17 android:startColor="color" 18 android:type="linear|radial|sweep" 19 android:useLevel="true|false" /> 20 <padding 21 android:bottom="integer" 22 android:left="integer" 23 android:right="integer" 24 android:top="integer" /> 25 <size 26 android:width="integer" 27 android:height="integer" /> 28 <solid android:color="color" /> 29 <stroke 30 android:width="integer" 31 android:color="color" 32 android:dashGap="integer" 33 android:dashWidth="integer" /> 34 35 </shape>
- android:shape
表示图形形状:rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环),默认矩形,line和ring必须有 < stroke>标签来指定宽度和颜色,否则达不到预期效果。 -
< gradient> 渐变效果,与< solid>标签互斥
-
< solid> 纯色填充 通过android:color即可指定shape的颜色
LayerDrawable
它是一种层次化的Drawable,在< layer-list>< /layer-list>结点下有多个< item>< /item>其中后面的< item>< /item>叠加在前面的< item>< /item>上面,想爱你面是一耳光文本输入框的例子:
1 <?xml version="1.0" encoding="utf-8"?> 2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item> 4 <shape android:shape="rectangle"> 5 <solid android:color="#0ac39e" /> 6 </shape> 7 </item> 8 <item android:bottom="6dp"> 9 <shape android:shape="rectangle"> 10 <solid android:color="#ffffff" /> 11 </shape> 12 </item> 13 <item 14 android:bottom="1dp" 15 android:left="1dp" 16 android:right="1dp"> 17 <shape android:shape="rectangle"> 18 <solid android:color="#ffffff" /> 19 </shape> 20 </item> 21 22 </layer-list>
StateListDrawable
StateListDrawable对应< selector>标签,这个大家应该比较熟悉。我们经常会给Button设置一个selector。StateListDrawable表示Drawable的集合,集合中的每个Drawable都对应着View的一种状态,系统会根据View的状态来给View设定相应的Drawable,下面是一个selector的创建样例:
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item android:drawable="@android:color/black"/> <!-- 表示默认状态--> 4 <item android:state_focused="true" 5 android:drawable="@android:color/holo_orange_dark"/><!-- 表示获取焦点状态--> 6 <item android:state_pressed="true" 7 android:drawable="@android:color/holo_red_dark"/><!-- 表示被点击状态--> 8 </selector>