美文网首页高级UI
二十、Android Drawable资源详细

二十、Android Drawable资源详细

作者: 清梦星河哈 | 来源:发表于2019-07-23 13:43 被阅读0次

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);

相关文章

网友评论

    本文标题:二十、Android Drawable资源详细

    本文链接:https://www.haomeiwen.com/subject/xtonlctx.html