Drawable动画

本文详细介绍了Android平台上的Drawable动画,即帧动画的概念与实现方法。包括使用XML定义动画、硬编码方式创建动画的具体步骤及示例代码,展示了如何通过ImageView显示动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Drawable动画

标签: Android


也可以称作帧动画,就是一系列的Drawable资源依次绘制出来,形成的动画效果。
AnimationDrawable 的基本类是AnimationDrawable 。
AnimationDrawable是一个Drawable而不是Animation,其类的继承关系如下:

android.graphics.drawable.Drawable 
    android.graphics.drawable.DrawableContainer 
        android.graphics.drawable.AnimationDrawable 

和View动画一样,可以通过XML和硬编码两种方式来定义Drawable动画。

XML形式

xml文件建议放在 res/drawable/目录下,文件的形式如下:

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

android:oneshot是指该动画是只播放一次还是循环播放。
每个item标签指明了其中的一个帧,内部包括android:drawable和android:duration分别代表播放的drawable资源和停留时间。

常用API

Modifier and TypeMethodDescription
voidaddFrame(Drawable frame, int duration)添加一帧到动画
intgetDuration(int i)
DrawablegetFrame(int index)
intgetNumberOfFrames()
voidinflate(Resources r, XmlPullParser parser, AttributeSet attrs)从XML文件中展开Drawable动画.
booleanisOneShot()
booleanisRunning()返回动画是否还在运行.
Drawablemutate()继承自Drawable类.使drawable可变
voidrun()可以在子类中重写,不要直接调用.
voidsetOneShot(boolean oneShot)设置运行一次还是重复运行.
booleansetVisible(boolean visible, boolean restart)设置是否可见.
voidstart()开始运行动画.
voidstop()停止动画.
voidunscheduleSelf(Runnable what)Drawable.Callback 接口的实现.

xml文件的使用

XML文件:

<?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/lighthouse"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/penguins"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/tulips"
        android:duration="1000"/>

</animation-list>

在代码中使用xml文件,就如同使用drawable资源一样,既可以在xml文件中赋给ImageView作为背景,可以把它放在ImageView中通过代码作为背景。

然后通过ImageView的getBackground()得到这个Drawable。然后调用start() 方法开始运行动画.

这里通过xml来举例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="300dp"
        android:background="@drawable/drawableanim" />

    <Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Anim" />

</LinearLayout>

java代码:

package com.example.scrolltest;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class DrawableAnim extends Activity {
    ImageView iv ;
    Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawanimlayout);
        iv=(ImageView)findViewById(R.id.imageView1);
        bt=(Button)findViewById(R.id.button1);
        final AnimationDrawable drawableAnim=(AnimationDrawable) iv.getBackground();
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                drawableAnim.start();
            }
        });
    }


}

效果图:
这里写图片描述

注意:

动画的开始start()方法不能够在onCreate()中调用,因为那时AnimationDrawable还没有attach到window。如果想Activity启动后调用,可以在 onWindowFocusChanged()方法里调用,这个时候界面获得了焦点,调用不会出错。

(我试了一下,但是并没有出错,也能正常运行动画,可能这个是不能够保证一定已经attach到window了)

硬编码

当XML无法满足需求的时候,可是使用代码来定义Drawable动画,比如Drawable资源不是预设好的,而是来自于网络,这时候可以通过代码来添加Drawable对象。
下面代码实现和上面XML方式同样效果的帧动画。

package com.example.scrolltest;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class DrawableAnim extends Activity {
    ImageView iv ;
    Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawanimlayout);
        iv=(ImageView)findViewById(R.id.imageView1);
        bt=(Button)findViewById(R.id.button1);
        //final AnimationDrawable drawableAnim=(AnimationDrawable) iv.getBackground();
        final AnimationDrawable drawableAnim=new AnimationDrawable();
        Drawable drawable1=getResources().getDrawable(R.drawable.lighthouse);
        Drawable drawable2=getResources().getDrawable(R.drawable.penguins);
        Drawable drawable3=getResources().getDrawable(R.drawable.tulips);
        drawableAnim.addFrame(drawable1, 1000);
        drawableAnim.addFrame(drawable2, 1000);
        drawableAnim.addFrame(drawable3, 1000);
        drawableAnim.setOneShot(false);
        iv.setBackground(drawableAnim);
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                drawableAnim.start();
            }
        });
    }


}

效果相同,不再加图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值