澳门新葡萄京娱乐场Android 的各种 Drawable 详解

概述

android内置了之类三种Drawable类型:ColorDrawable、GradientDrawable、BitmapDrawable、
Nine帕特chDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、
RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、
StateListDrawable、TransitionDrawable、ShapeDrawable。

Android把可绘制的指标抽象为Drawable,差别的图形图像财富就代表着不相同的drawable类型。Android
FrameWork提供了一部分具体的Drawable达成,平日在代码中都不会直接接触Drawable的兑现类。

参考
http://blog.csdn.net/yuzhiyuxia/article/details/8806488

1.BitmapDrawable

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"

        <!--图片的资源 -->
        android:src="@drawable/create"
        <!--是否抗锯齿-->
        android:antialias="true"
        <!--是否开启抖动效果-->
        android:dither="true"
        <!--开启过滤效果-->
        android:filter="true"
        <!--图片大小和容器不符合时图片摆放位置,拉伸,裁剪-->
        android:gravity="
        <!--图片大小不发生变化-->
        top|bottom|left|right
        |center_vertical|center_horizontal|center
        <!--图片大小发生变化-->
        |fill_vertical|fill_horizontal|fill
        |clip_vertical|clip_horizontal"
        <!--纹理映射,图像处理技术,一般用不到-->
        android:mipMap="false"
        <!--平铺模式,开启此属性gravity会失效
       disabled 关闭
       clamp 图片四周像素会扩散到周围区域
       repeat 简单的水平和竖直方向重复图片
       mirror 图片倒立重复图片
        -->
        android:tileMode=" ["disabled"|"clamp"|"repeat"|"mirror"]"
    >

</bitmap>

ColorDrawable

ColorDrawable平时设置在colors.xml文件中,举个例子设置View背景为纯色,实际安装的正是ColorDrawable

public void setBackgroundColor(@ColorInt int color) {  
      if (mBackground instanceof ColorDrawable) {  
          ((ColorDrawable) mBackground.mutate()).setColor(color);  
          computeOpaqueFlags();  
          mBackgroundResource = 0;  
      } else {  
          setBackground(new ColorDrawable(color));  
      }  
  }

Android内置了如下两种Drawable类型:
BitmapDrawable Drawable子类之—— BitmapDrawable
(可调节对齐平铺的图像)
ColorDrawable
GradientDrawable
NinePatchDrawable
InsetDrawable Drawable子类之——InsetDrawable
(嵌入)
ClipDrawable Drawable子类之——ClipDrawable
(裁剪图像)
ScaleDrawable
RotateDrawable
AnimationDrawable
LayerDrawable Drawable子类之——LayoutDrawable
(图层叠合)
LevelListDrawable Drawable子类之——LevelListDrawable
(等第列表图片)
StateListDrawable Drawable子类之—— ShapeDrawable
(图形定义)
TransitionDrawable Drawable子类之——TransitionDrawable
(渐变)

2.NinePatchDrawable

点9图能够自动依照所需的宽高实行对应的缩放并确认保障不失真

属性基本和BitmapDrawable雷同

<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/create"
    >

</nine-patch>

GradientDrawable常常用来设置渐变色。

写在XML文件中日常和shape结合使用

<?xml version="1.0" encoding="utf-8"?>  
<shape xmlns:android="http://schemas.android.com/apk/res/android">  
    <gradient  
        android:startColor="#FFF"  
        android:endColor="#000"  
        android:angle="45" />  
</shape>

GradientDrawable的结构函数:public
GradientDrawable(GradientDrawable.Orientation orientation,
int[] colors)

StateListDrawable (背景图片卡塔尔(قطر‎<selector />

3.ShapeDrawable

在代码中生成的是GradientDrawable对象

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    <!--图形 可以是rectangle(矩形)
                   oval(椭圆)
                   line(线)
                   ring(圆环)
    -->
    android:shape=""
    <!--以下是圆环特有属性
    圆环内径-->
    android:innerRadius="@dimen/activity_horizontal_margin"

    <!--内径所占整个Drawable的比例 默认为9,如果为n,那么内半径=宽度/n,以innerRadius为主-->
    android:innerRadiusRatio="1"
    <!--圆环厚度-->
    android:thickness="@dimen/activity_horizontal_margin"
    <!--厚度所占整个Drawable的比例 默认为3,如果为n,那么厚度=宽度/n,以thickness为主-->
    android:thicknessRatio="1"
    <!--除非用于LevelListDrawable一般为false-->
     android:useLevel="false"

    >

    <!--Drawable的内在宽高-->
    <size android:height="@dimen/activity_horizontal_margin"
          android:width="@dimen/activity_horizontal_margin"/>
    <!--包含这个Drawable的View的空白-->
    <padding
        android:top="@dimen/activity_horizontal_margin"
        android:bottom="@dimen/activity_horizontal_margin"
        android:left="@dimen/activity_horizontal_margin"
        android:right="@dimen/activity_horizontal_margin"
        />
    <!--适用于rectangle四个角的圆角半径-->
    <corners
        android:radius="@dimen/activity_horizontal_margin"
        android:topLeftRadius="@dimen/activity_horizontal_margin"
        android:topRightRadius="@dimen/activity_horizontal_margin"
        android:bottomRightRadius="@dimen/activity_horizontal_margin"
        android:bottomLeftRadius="@dimen/activity_horizontal_margin"
        />
    <!--颜色填充使用纯色-->

     <solid android:color="@color/colorAccent"/>
     <!--颜色填充使用渐变色-->
    <gradient
    <!--渐变类型
    linear 线性渐变(默认)
    radial  径向渐变
    sweep  扫描线渐变
    -->
        android:type=""

        <!-- 渐变的角度默认为0,其值必须为45的倍数
        0代表从左到右
        90代表从下到上-->
        android:angle="0"
        <!--渐变中心点坐标-->
        android:centerX="1"
        android:centerY="1"

        android:startColor="@color/colorAccent"
        android:centerColor="@color/colorAccent"
        android:endColor="@color/colorAccent "
        <!--渐变半径 仅当type等于radial有效-->
        android:gradientRadius="1"
         <!--除非用于LevelListDrawable一般为false-->
        android:useLevel="false"
        />

   <!--描边-->
    <stroke
        <!--描边宽度-->
        android:width="@dimen/activity_horizontal_margin"
        <!--描边颜色-->
        android:color="@color/colorAccent"
        <!--设置为虚线描边宽度与dashGap同时使用才能生效-->
        android:dashWidth="@dimen/activity_horizontal_margin"
        <!--描边虚线间隔空隙-->
        android:dashGap="@dimen/activity_horizontal_margin"
        />
</shape>

BitmapDrawable

BitmapDrawable就十分少介绍怎么样了,最常用的从drawable中加载的图形都以BitmapDrawable

当StatListDrawable财富作为组件的背景恐怕前程Drawable能源时,能够趁机组件状态的改观而机关注换相对应的能源,举个例子,一个Button可以处于差异的事态(按键按下、获取关节State of Qatar

4.LayerDrawable

一种分歧等级次序的Drawable的会集,放置差别范畴而落得叠合后的功用,二个layer-list可含蓄多少个item
暗中认可情形下,layer-list中保有的View都会被缩放至View的高低(对于bitmap可经过android:gravity调节图片呈现效果),上边的item会覆盖上边的item。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">


    <item 
            <!--可引用一个drawable资源-->
          android:drawable="@drawable/drawable_bitmap"
          <!--drawable相对于View的偏移量-->
          android:top="@dimen/activity_horizontal_margin"
          android:bottom="@dimen/activity_horizontal_margin"
          android:left="@dimen/activity_horizontal_margin"
          android:right="@dimen/activity_horizontal_margin"
        >
    <item>
        <shape android:shape="rectangle"
            >
            <solid android:color="#0ac39e"/>
        </shape>
    </item>
    <item android:bottom="6dp">
        <shape android:shape="rectangle"
            >
            <solid android:color="#ffffff"/>
        </shape>
    </item>
    <item android:bottom="1dp"
          android:left="1dp"
          android:right="1dp"

        >
        <shape android:shape="rectangle"
            >
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</layer-list>

NinePatchDrawable

Nine帕特chDrawable是点九图片,NinePatchDrawable美术的是四个方可伸缩的位图图像。Android会自动调节大小来宽容呈现的内容,平时用来做能够被拉伸的背景。

咱俩得以选择三个StateListDrawable能源,来提供分歧的背景图片对于每三个气象。,当组件的情况改变时,会自定向下遍历StateListDrawable对应的xml文件来寻觅第二个地位特别的Item

5.StateListDrawable

不等情况选取分化drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"

         <!--StateListDrawable固有大小是否随着drawable的切换而发生变化为true不发生变化,为item中drawable最大的固有大小 默认为false-->
          android:constantSize="true"
          <!--是否开启防抖效果-->
          android:dither="true"
          <!--StateListDrawable的padding是否随着drawable的切换而发生变化,为false不变是所有item中drawable padding的最大值,默认为false-->
          android:variablePadding="true"
    >
    <item android:drawable="@drawable/create" android:state_pressed="true"/>
    <item android:drawable="@drawable/create" android:state_focused="true" />
    <item android:drawable="@drawable/create" android:state_checked="true" />
    <!--默认-->
    <item android:drawable="@drawable/create" />

</selector>

InsetDrawable

InsetDrawable
代表一个drawable嵌入到其它二个drawable内部,何况在其间留部分间隔,那点很像drawable的padding属性,差距在于
padding表示drawable的剧情与drawable自身的边距,insetDrawable表示三个drawable和容器之间的边距。当控件须要的背景比实际的边框小的时候比较符合利用InsetDrawable。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--android:state_pressed 是否按下,如一个按钮触摸或者点击。-->
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <!--android:state_focused 是否取得焦点,比如用户选择了一个文本框。-->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <!--android:state_hovered 光标是否悬停-->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered -->
    <!--默认-->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>
以下是Button的Layout文件:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
当然我们也可以通过代码来设置Button的背景图片:

Button imageButton=(Button)findViewById(R.id.imageButton);

imageButton.setBackgroundResource(com.jeriffe.app.R.drawable.button_statelist);

6.LevelListDrawable

Drawable的集聚,每一种Drawable都可安装最小level和最大level,View的背景可由此getBackground(卡塔尔.setLevel()设置不一样了Level相配分歧的Drawable
ImageView的话可通过setIamgeLevel(卡塔尔(قطر‎相称差异的Drawable

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/create"
            android:minLevel="0"
            android:maxLevel="0"
        >
    </item>
    <item android:drawable="@drawable/b_now" android:maxLevel="1"/>
    <item android:drawable="@drawable/tap_launch" android:maxLevel="2"/>
    <item android:drawable="@drawable/uilib" android:maxLevel="3"/>


</level-list>

ClipDrawable

ClipDrawable是经过设置三个Drawable的方今呈现比例来裁剪出另一张Drawable,你能够由此调节和测验这么些比重来控裁定剪的宽高,以至裁剪内容占总体容器的权重,通过ClipDrawable的setLevel(卡塔尔方法调解呈现比例能够兑现近似Progress进程条的功力。ClipDrawable的level值范围在[0,10000],level的值越大裁剪的开始和结果越少,即便level为10000时则完全呈现。

<?xml version="1.0" encoding="utf-8"?>  
 <clip  
 xmlns:android="http://schemas.android.com/apk/res/android"  
 android:drawable="@drawable/drawable_resource"  
 android:clipOrientation=["horizontal" | "vertical"]  
 android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |  
                  "fill_vertical" | "center_horizontal" | "fill_horizontal" |  
                  "center" | "fill" | "clip_vertical" | "clip_horizontal"] />

clip成分中独有android:drawable、android:clipOrientation和android:gravity八个属性,当中android:drawable为索要裁剪的本来面目图片,android:clipOrientation为裁剪的矛头,能够依据垂直(vertical卡塔尔(قطر‎或然水平(horizontal卡塔尔国方向举行裁剪,android:gravity为钦点从哪儿起先裁剪,那一个能够透过或操作设置八个属性。

android:state_pressed 是还是不是按下,如一个开关触摸恐怕点击。
android:state_focused 是还是不是拿走关键,比方顾客筛选了一个文本框。
android:state_hovered 光标是不是终止,常常与focused
state近似,它是4.0的新特征android:state_selected 被入选,它与focus
state并不完全平等,如二个list view
被选中的时候,它在那之中的各种子组件或然由此方向键,被选中了。
android:state_checkable
组件是还是不是能被check。如:RadioButton是足以被check的。
android:state_checked
被checked了,如:一个RadioButton可以被check了。android:state_enabled
可以承当触摸或许点击事件android:state_activated
被激活(这个麻烦举个例子,不是特通晓卡塔尔android:state_window_focused
应用程序是不是在前台,当有通告栏被拉下来照旧二个对话框弹出的时候应用程序就不在前台了

7.TransitionDrawable

只得兑现三个Drawable的淡入淡出效果
暗许突显item1

 TransitionDrawable drawable= (TransitionDrawable) mIvLevel.getBackground();
        if (!mBoolean)
        {

            //从item1淡出,item2淡入
            drawable.startTransition(1000);
            mBoolean=true;
        }
        else
        {
            //反转
            drawable.reverseTransition(1000);
            mBoolean=false;
        }

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/b_now"
          android:top="@dimen/activity_horizontal_margin"
          android:bottom="@dimen/activity_horizontal_margin"
          android:left="@dimen/activity_horizontal_margin"
          android:right="@dimen/activity_horizontal_margin"

        ></item>
    <item android:drawable="@drawable/create"></item>
</transition>

AnimationDrawable

AnimationDrawable经常是将几张图串起来做二个回顾动漫,

<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  
    <item  
        android:drawable="@drawable/on_001"  
        android:duration="100"/>  
    <item  
        android:drawable="@drawable/on_002"  
        android:duration="100"/>  

    <item  
        android:drawable="@drawable/on_003"  
        android:duration="100"/>  
    <item  
        android:drawable="@drawable/on_004"  
        android:duration="100"/>  
    <item  
        android:drawable="@drawable/on_005"  
        android:duration="100"/>  
    <item  
        android:drawable="@drawable/on_006"  
        android:duration="100"/>  
</animation-list>

留心:假如有七个item,那么程序将电动从上到下实行相称,最早相称的将获取利用。(不是因而顶级相称)借使三个item没有任何的情景表明,那么它将得以被其它多个气象万分。

8.InsetDrawable

把Drawable内嵌到和睦个中

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:drawable="@drawable/create"
       android:insetBottom="@dimen/activity_horizontal_margin"
       android:insetLeft="@dimen/activity_horizontal_margin"
       android:insetRight="@dimen/activity_horizontal_margin"
       android:insetTop="@dimen/activity_horizontal_margin"
    >
    <shape android:shape="rectangle">
        <solid android:color="@color/colorAccent"></solid>
    </shape>
</inset>

ScaleDrawable

ScaleDrawable,RotateDrawable分别用来对图纸张开拉伸和旋转。

ShapeDrawable(圆角)<shape />

9.ScaleDrawable

相符裁减四个特定的drawable

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/create"
        <!--缩放宽高比例越大 Drawable显示越小-->
       android:scaleWidth="1%"
       android:scaleHeight="50%"
       android:scaleGravity="center"
       <!--level取值0到10000 为0不显示,level越大Drawable显示越大-->
       android:level="1"
    >
</scale>

LayerDrawable

一个LayerDrawable是四个能够管理一组drawable对象的drawable。在LayerDrawable的drawable能源根据列表的顺序绘制,列表的结尾多个drawable绘制在最上层。

要素:<layer-list>必得的。 并且要作为根节点。
包含三个可能两个<item>成分
属性:xmlns:android 必得的。 定义xml文件的命名空间,必得是

<item>定义一个drawable放置在layer
drawable中,具体的岗位有它的。必需是<selector>的子成分(这一个不太精通)。可采取<bitmap>做为子成分

属性:
android:drawable  Drawable资源。必须的。引用的drawable资源
android:id  能源ID。叁个为那个item定义的独一的财富ID。
使用:”@+id/name”.那样的措施。可以搜寻或涂改这些drawable通过上边包车型大巴艺术:View.findViewById()orActivity.findViewById(卡塔尔.
android:top   Integer。与top的间隔,单位像素
android:right  Integer。与right的相距,单位像素
android:bottom  Integer。与bottom的偏离,单位像素
android:left  Integer。与left的离开,单位像素

在暗许的情形下,全部的drawable
item都会缩放到适当的分寸来适应视图。因而,在贰个layer-list中定义分化的岗位恐怕会追加视图的尺寸和被活动缩放。为了幸免被缩放,能够再<item>节点里充分<bitmap>成分来钦点二个drawable,何况定义一些不会被拉伸的gravity属性,比方center。

举个例证,上边在item里面定义多少个drawable,图片就能够自动缩放以适应视图的大大小小。

<item android:drawable="@drawable/image" />

为了防止缩放,能够利用<bitmap>的子成分来内定drawable财富

<item>
 <bitmap android:src="@drawable/image"
 android:gravity="center" />
 </item>

ShapeDrawable财富绘制三个一定的模样,比方矩形、椭圆等。尽管你想和煦动态的绘图几个人图形,那么我们就能够运用ShapeDrawable能源对象,用ShapeDrawable,大家得以绘制大家所能想象的形制。。二个ShapeDrawable
要求八个Shape对象来治本表现财富到UI
Screen,若无Shape设置,那么会暗许使用RectShape对象。
ShapeDrawable 被定义在一个XML文件中,以 <shape>
要素早先。在那之中间的每三个Drawable财富内嵌在<item>成分中

10.ClipDrawable

剪裁Drawable 由clipOrientation和gravity协作决定裁剪位置

ClipDrawable clipDrawable= (ClipDrawable)
mIvLevel.getDrawable();
//level取值0到10000,取值越大裁剪越少 0完全裁剪,10000表示不裁剪
clipDrawable.setLevel(5000);

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
      android:drawable="@drawable/create"
      <!--裁剪的方向-->
      android:clipOrientation="vertical"
      android:gravity="center"

    >
</clip>

StateListDrawable

StateListDrawable平日用作selector,设置分化的背景恐怕颜色。ShapeDrawable定义了三种图形,也是相比较常用的。

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <!-- 定义填充渐变颜色 -->
    <gradient 
        android:startColor="#00f" 
        android:endColor="#00f" 
        android:angle="45"
        android:type="sweep"/> 
    <!-- 设置内填充 -->
    <padding android:left="7dp" 
        android:top="7dp" 
        android:right="7dp" 
        android:bottom="7dp" />
    <!-- 设置圆角矩形 -->
    <corners android:radius="8dp" /> 
</shape>

自定义Drawable

public class CustomDrawable extends Drawable {

    private Paint mPaint;

    public CustomDrawable(int  color) {
        mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(color);
    }

    @Override
    public void draw(Canvas canvas) {
        final Rect rect=getBounds();
        float cx=rect.exactCenterX();
        float cy=rect.exactCenterY();
        canvas.drawCircle(cx,cy,Math.min(cx,cy),mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
        invalidateSelf();

    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

        mPaint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

LevelListDrawable

LevelListDrawable对应于<level-list标签>,跟selector同样,它也代表二个drawable集结。使用方法如下。

<?xml version="1.0" encoding="utf-8level_drawable"?>    
<level-list    
    xmlns:android="http://schemas.android.com/apk/res/android">    
    <item     
        android:drawable="@drawable/ic_launcher"    
        android:maxLevel="0"/>    

    <item     
        android:drawable="@drawable/icon1"    
        android:maxLevel="1"/>    
</level-list>

<ImageView    
        android:id="@+id/cv"    
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:layout_margin="20dp"     
        android:src="@drawable/level_drawable"/>

小心这里要用src,background是不起效能的。

要求改换图片时,调用那一个情势iView.setImageLevel(1卡塔尔(قطر‎;

ClipDrawable(裁剪)<clip />

圆形Drawable

public class CircleImageDrawable extends Drawable {

    private Paint mPaint;
    private int mWidth;
    private Bitmap mBitmap ;

    public CircleImageDrawable(Bitmap bitmap)
    {
        mBitmap = bitmap ;
        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
                Shader.TileMode.CLAMP);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setShader(bitmapShader);
        mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());
    }

    @Override
    public void draw(Canvas canvas)
    {
        canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mPaint);
    }

    @Override
    public int getIntrinsicWidth()
    {
        return mWidth;
    }

    @Override
    public int getIntrinsicHeight()
    {
        return mWidth;
    }

    @Override
    public void setAlpha(int alpha)
    {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf)
    {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity()
    {
        return PixelFormat.TRANSLUCENT;
    }
}

TransitionDrawable

叁个TransitionDrawable是四个优异的Drawable对象,能够兑现八个drawable财富之间淡入淡出的职能。

<transition>节点下的各个<item>代表一个drawable能源。只可以有多少个<item>。先前改换调用startTransition()。向后,调用 reverseTransition()

文本坐落于:

res/drawable/filename.xml
文本名作为能源ID

编写翻译财富类型:

指向 TransitionDrawable的指针

能源援引:

In Java: R.drawable.filename
In XML: @[package:]drawable/filename

语法:

<?xml version="1.0" encoding="utf-8"?>  
<transition  
xmlns:android="http://schemas.android.com/apk/res/android" >  
    <item  
        android:drawable="@[package:]drawable/drawable_resource"  
        android:id="@[+][package:]id/resource_name"  
        android:top="dimension"  
        android:right="dimension"  
        android:bottom="dimension"  
        android:left="dimension" />  
</transition>

事例:XML文件保留为:res/drawable/transition.xml

<?xml version="1.0" encoding="utf-8"?>  
<transition xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:drawable="@drawable/on" />  
    <item android:drawable="@drawable/off" />  
</transition>

在layout文件中选拔:

<ImageButton  
    android:id="@+id/button"  
    android:layout_height="wrap_content"  
    android:layout_width="wrap_content"  
    android:src="@drawable/transition" />

ImageButton button = (ImageButton) findViewById(R.id.button);  
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();  
drawable.startTransition(500);

ClipDrawable能源定义在二个XML中,表示裁剪(Clips卡塔尔三个其余财富基于ClipDrawable财富的Level。你能够控裁定剪的Drawable的宽窄中度及gravity属性,ClipDrawable平常被用来作为二个progressbars的贯彻。

圆角矩形Drawable

public class RoundImageDrawable extends Drawable {
    private Paint mPaint;
    private Bitmap mBitmap;

    private RectF rectF;

    public RoundImageDrawable(Bitmap bitmap)
    {
        mBitmap = bitmap;
        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
                Shader.TileMode.CLAMP);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setShader(bitmapShader);
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom)
    {
        super.setBounds(left, top, right, bottom);
        rectF = new RectF(left, top, right, bottom);
    }

    @Override
    public void draw(Canvas canvas)
    {
        canvas.drawRoundRect(rectF, 30, 30, mPaint);
    }

    @Override
    public int getIntrinsicWidth()
    {
        return mBitmap.getWidth();
    }

    @Override
    public int getIntrinsicHeight()
    {
        return mBitmap.getHeight();
    }

    @Override
    public void setAlpha(int alpha)
    {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf)
    {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity()
    {
        return PixelFormat.TRANSLUCENT;
    }
}
<?xml version="1.0" encoding="utf-8"?>

<clip xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/android"

android:clipOrientation="horizontal"

android:gravity="left" />
下面的ImageView布局文件应用Clipdrawable资源:



<ImageView

android:id="@+id/image"

android:background="@drawable/clip"

android:layout_height="wrap_content"

android:layout_width="wrap_content" />

AnimationDrawable(动画)<animation-list/>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

我们能够见见,AnimationDrawable财富文件以<animation-list>成分为根,包蕴一种类的<Item>节点,每一个节点定义了一个帧(frame卡塔尔及持续时常。

上述动漫运转了3个帧,通过设置android:oneshot
属性(attributeState of Qatar为true,动漫会循环二回并滞留在终极一帧,假设为false那么会轮询(loop卡塔尔的运行动漫

咱俩能够通过编码来加载播放动漫:

 // Load the ImageView that will host the animation and
 // set its background to our AnimationDrawable XML resource.
 ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
 img.setBackgroundResource(R.drawable.spin_animation);

 // Get the background, which has been compiled to an AnimationDrawable object.
 AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();

 // Start the animation (looped playback by default).
 frameAnimation.start();

瞩目:AnimationDrawable.
start(卡塔尔国方法不可能在Activity的onCreate()方法中调用,因为AnimationDrawable还未有完全的增大(attached卡塔尔到Window,要是你没有须要互相而及时播放动漫,那么能够在onWindowFocusChanged(卡塔尔(قطر‎方法中,那个方法会在您的Activity Windows获取关节是触发。

发表评论

电子邮件地址不会被公开。 必填项已用*标注