Drawable资源是 Android应用中使用最广泛的资源,也是Android应用中最灵活的资源,它不仅可以直接使用 *.png *.jpg *.gif *.9.png等图片作为资源,也可使用多种XML文件作为资源。只要一份XML文件可以被系统编译成 Drawable子类的对象,那么这份XML文件即可作为 Drawable资源。
Android不容许图片资源的文件名中出现大写字母,且不能以数字开头。否则Android SDK无法为该图片在R类中生成资源索引。
1.StateListDrawable资源
定义StateListDrawable对象的XML文件的根元素为<selector...../>,该元素可以包含多个<item.../>元素,该元素可以指定如下属性:
android:color或android:drawable //指定颜色或Drawable对象。
android:state_xxx //指定一个特定状态。
StateListDrawable支持的状态
状态属性值 | 含义 |
---|---|
android:state_active | 代表是否处于激活状态 |
android:state_checkable | 代表是否处于可勾选状态 |
android:state_checked | 代表是否处于勾选状态 |
android:state_enabled | 代表是否处于可用状态 |
android:state_first | 代表是否处于开始状态 |
android:state_focused | 代表是否处于已得到焦点状态 |
android:state_last | 代表是否处于结束状态 |
android:state_middle | 代表是否处于中间状态 |
android:state_pressed | 代表是否处于已被按下状态 |
android:state_selected | 代表是否处于已被选中状态 |
android:state_window_focused | 代表是否窗口已得到焦点状态 |
2.LayerDrawable资源
与StateListDrawable有点类似,LayerDrawable也可包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象就会被绘制在最上面。
定义LayerDrawable对象的XML文件的根元素<layer-list.../>,该元素可以包含多个<item..../>元素,该元素可指定如下属性:
android:drawable //指定作为LayerDrawable元素之一的Drawable对象。
android:id //为该Drawable对象指定一个标识。
android:button|top|left|right //它们用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置。
例如拖动条的外观
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!--定义轨道背景-->
<item android:id="@android:id/background"
android:drawable="@drawable/grow"/>
<!--定义轨道上已完成部分的外观-->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"/>
</layer-list>
定义一个三个叠在一起的Drawable对象
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@drawable/yuan"
android:gravity="center"/>
</item>
<item android:top="50dp" android:left="50dp">
<bitmap android:src="@drawable/yuan"
android:gravity="center"/>
</item>
<item android:top="100dp" android:left="100dp">
<bitmap android:src="@drawable/yuan"
android:gravity="center"/>
</item>
</layer-list>
叠加图片
3.ShapeDrawable资源
ShapeDrawable用于定义一个基本的几何图形(如矩形、圆、线条等),定义ShapeDrawable的XML文件的根元素是<shape..../>,该元素可指定如下属性:
android:shape=["rectangle" | "oval" | "line" | "ring"] //指定定义哪种类型的几何图形
定义ShapeDrawable对象的完整语法格式:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/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="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["line" | "radial" | "sweep"]/>
<!--定义几何形状内边距-->
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer"/>
<!--定义几何形状的大小-->
<size
android:height="integer"
android:width="integer" />
<!--定义使用单种颜色填充-->
<solid
android:color="color"/>
<!--定义几何形状绘制边框-->
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer"/>
</shape>
4.ClipDrawable资源
ClipDrawable代表从其他位图上截取的一个“图片片段”。下面为语法:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/switcher1"//指定截取的源Drawable对象
android:clipOrientation="horizontal | vertical"//指定截取的方向
android:gravity="top | bottom | left | right | center_horizontal ...">//指定截取时的对其方式
</clip>
使用ClipDrawable对象时可调用setLevel(int)方法来设置截取的区域大小,当level为0时,截取的图片片段为空,当level为10000时,截取整张图片。
例子,徐徐展开的图片
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/switcher1"
android:clipOrientation="horizontal"
android:gravity="center">
</clip>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity10);
ImageView imageView = findViewById(R.id.imageView);
final ClipDrawable clipDrawable = (ClipDrawable)imageView.getDrawable();
@SuppressLint("HandlerLeak")
final Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.what == 0x1233){
//修改clipDrawable的level值
clipDrawable.setLevel(clipDrawable.getLevel() + 500);
}
}
};
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 0x1233;
handler.sendMessage(msg);
//取消定时器
if(clipDrawable.getLevel() >= 10000){
timer.cancel();
}
}
}, 0, 35);
}
5.AnimationDrawable资源
AnimationDrawable代表一个动画,这里只介绍简单的补间动画,后面再写更详细的Android动画。定义补间动画的XML资源文件以<set...../>元素作为根元素,该元素内可以指定如下4个元素:
- alpha 设置透明度的改变
- scale 设置图片进行放缩改变
- translate 设置图片进行位移变换
- rotate 设置图片进行旋转
语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:repeatMode="restart | reverse"
android:duration="integer"
android:shareInterpolator="true | false">
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:fromYScale="float"
android:pivotX="float"
android:pivotY="float"
android:toXScale="float"
android:toYScale="float" />
<translate
android:fromXDelta="float"
android:fromYDelta="float"
android:toXDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:pivotX="float"
android:pivotY="float"
android:toDegrees="float" />
</set>
fromXXX、toXXX属性指定开始状态和结束状态,pivotX、pivotY两个属性是指定中心点,除此之外可以指定android:interpolator属性,该属性指定动画的变化速度。下面Android系统中速度常量:
- linear_interpolator 匀速变换
- accelerate_interpolator 加速变换
- decelerate_interpolator 减速变换
如果想让<set.../>元素下所有的变换效果使用相同的动画速度,指定
android:shareInterpolator=“true”’。
为了在Java代码中获取实际Animation,可以用AnimationUtils的如下方法:
loadAnimation(Context context, int resId);
Animation anim = AnimationUtils.loadAnimation(context, R.anim.my_anim);
image.startAnimation(anim);
网友评论