简介
Drawable是一种可以在Canvas上进行绘制的抽象的概念,种类繁多,最常见的颜色和图片都可以是一个Drawable。
表示一种图像的概念(不一定是图片,可以是颜色形成的图像)
一般没有大小的概念,当作为View的背景时,Drawable会被拉伸至View的同等大小
BitmapDrawable(可直接引用,也可在XML文件中设置)
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/pic15" //图片资源id
android:antialias="true" //是图片变得平滑
android:dither="true" //开启抖动,高质量图片在低质量设备上更好的显示
android:filter="true" //图片拉伸或压缩情况下更好的显示
android:mipMap="false" //纹理映射,默认false
android:gravity="center_horizontal" //设置位置,可使用“|”多选
android:tileMode="clamp" //平铺模式(clamp、repeat、mirror、disable四种模式)
/>
ShapeDrawable(通过颜色构造图形,可以纯色也可以渐变色)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">//形状(矩形rectangle,椭圆oval,横线line,圆环ring)
<solid android:color="#ff0000" />//纯色填充
<corners//表示shape的四个角度,只适用于矩形
android:bottomLeftRadius="0dp"
android:bottomRightRadius="15dp"
android:topLeftRadius="10dp"
android:topRightRadius="15dp" />
<gradient//渐近色填充
android:centerColor="#00ff00"//渐变中间颜色
android:endColor="#0000ff"//渐变结束颜色
android:startColor="#ff0000"//渐变起始颜色
android:centerX="0.5"//渐变中心的的横坐标
android:centerY="0.5"//渐变中心的的纵坐标
android:angle="0"//渐变角度,必须是45的倍数
android:type="linear" />//渐变类别(线性,径向radio,扫描线sweep)
<padding android:left="20dp" />//包含shape的view的空白
<size//shape的大小(ShapeDrawable的固有宽高,当作为View的背景时会被拉伸或压缩)
android:height="30dp"
android:width="30dp" />
<stroke//shape的描边
android:dashGap="2dp"//组成虚线的线段间隔
android:dashWidth="10dp"//组成虚线的线段宽度
android:width="2dp"//描边的宽度
android:color="#00ff00" />//描边的颜色
</shape>
LayerDrawable(层次化的Drawable 集合)包含多个item,每一个item就是一个Drawable
对应于XML中的<layer-list>标签StateListDrawable
表示Drawable 集合
- 对应于<selector>标签
- 每个item代表一个Drawable,每个Drawable 对应着View的一种状态,系统会根据View的状态选择合适的Drawable,主要用于设置可点击的View
- 一般将默认的状态设置在最后,所有的都不匹配的时候使用最后一个状态
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true"//大小不随状态改变
android:dither="true"//抖动属性
android:variablePadding="false">//padding不随状态改变
<item android:state_pressed="true"
android:drawable="@color/colorAccent"/>
<item android:state_pressed="false"
android:drawable="@color/colorPrimary"/>
<item android:drawable="@color/colorPrimaryDark"/>
</selector>
LevelListDrawable
Drawable 集合,每一个Drawable 都有等级- 对应于<level-list>标签
- 作为View的背景时,使用Drawable的setLevel设置不同等级从而做到切换具体的Drawable
- 作为ImageView的前景时,使用ImageView的setImageLevel切换Drawable
- 等级范围是0-10000
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/pic15"
android:maxLevel="0"/>
<item android:drawable="@drawable/pic16"
android:maxLevel="1"/>
</level-list>
TransitionDrawable
- 对应于<transition>标签
- 用于实现两个Drawable之间的淡入淡出效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/pic15"/>
<item android:drawable="@drawable/pic16"/>
</transition>
<TextView
android:id="@+id/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/mytransition"/>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
TransitionDrawable drawable = (TransitionDrawable) textView.getBackground();
drawable.startTransition(1000);
}
InsetDrawable
- 将其他Drawable内嵌到自己当中,并且可以在四周留出空白
- 对应于<inset>标签
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="80dp"
android:insetLeft="30dp"
android:insetRight="105dp"
android:insetTop="0dp">
<shape android:shape="rectangle">
<solid android:color="#ff0000"/>
</shape>
</inset>
ScaleDrawable
根据自己的等级将自己的Drawable缩放一定的比例- 对应于<scale>标签
- 等级为0,ScaleDrawable不可见
- ScaleDrawable的级别越大,内部的drawable就越大
- ScaleDrawable在XML中所定义的缩放比例越大,内部的就drawable越小
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/pic15"
android:scaleHeight="70%"
android:scaleWidth="70%"
android:scaleGravity="center">
</scale>
<TextView
android:id="@+id/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myscale"/>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
ScaleDrawable scaleDrawable = (ScaleDrawable) textView.getBackground();
scaleDrawable.setLevel(1);
}
ClipDrawable
根据自己当前等级裁剪另一个Drawable- 对应于<clip>标签
- 裁剪方向通过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/pic15"
android:gravity="bottom">
</clip>
<TextView
android:id="@+id/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myclip"/>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
ClipDrawable clipDrawable = (ClipDrawable) textView.getBackground();
clipDrawable.setLevel(8000);
}