如何使用AnimationDrawable和animation-list创建顺序动画

时间:2013-07-24 13:34:31

标签: java android xml animation android-animation

我正在尝试创建一个顺序加载动画,显示5个点,这些点一个接一个地变黑,以显示加载动画。我已经建立了动画 - 但到目前为止 - 只有一个点变成黑色 - 我试图转动第二个黑色似乎不起作用(一旦我弄清楚如何动画它我会将方法应用于剩余的3个点 - 只是让你知道代码到底在哪里 - 我只是试图在这一点上设置第二个点的动画但它不起作用 - 第一个点应该闪烁 - 然后其他4个点没有任何反应动画)

-Amani Swann

SRC SNIPPET:

try {
        // updating layout initially has updating text with 1 dot in the xml
        setContentView(R.layout.updating);
        // This image view has the updating text to be progressively updated
        // with dots addition
        ImageView loading = (ImageView) findViewById(R.id.loading_empty1);
        //Button goButton = (Button) findViewById(R.id.loading_empty);
        // Set updating button to drawable animation
        loading.setBackgroundResource(R.drawable.updating1);
        loadingAnimation = (AnimationDrawable) loading.getBackground();


        ImageView loading2 = (ImageView) findViewById(R.id.loading_empty2);
        //Button goButton = (Button) findViewById(R.id.loading_empty);
        // Set updating button to drawable animation
        loading2.setBackgroundResource(R.drawable.updating2);
        loadingAnimation = (AnimationDrawable) loading2.getBackground();

ANIMATION XML SNIPPET#1:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"    
    android:oneshot="false">    
    <item android:drawable="@drawable/loading_empty" android:duration="500" />    
    <item android:drawable="@drawable/loading_full" android:duration="500" />    
</animation-list>

ANIMATION XML SNIPPET#2:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"    
    android:oneshot="false">    
    <item android:drawable="@drawable/loading_empty" android:duration="500" />    
    <item android:drawable="@drawable/loading_full" android:duration="500" />    
</animation-list>

布局XML:

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

    <TextView
        android:id="@+id/updating_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="@string/updating_text"
        android:textColor="#000000"
        android:textSize="14sp" />

    <ImageView
        android:id="@+id/loading_empty1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="150dp"
        android:layout_toLeftOf="@+id/loading_empty2"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/updating1"
        android:src="@drawable/loading_empty" />

    <ImageView
        android:id="@+id/loading_empty3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/loading_empty2"
        android:layout_centerHorizontal="true"
        android:background="@drawable/updating3"
        android:layout_marginRight="15dp"
        android:src="@drawable/loading_empty" />

    <ImageView
        android:id="@+id/loading_empty2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/loading_empty1"
        android:layout_toLeftOf="@+id/loading_empty3"
        android:background="@drawable/updating2"
        android:layout_marginRight="15dp"
        android:src="@drawable/loading_empty" />

    <ImageView
        android:id="@+id/loading_empty4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/loading_empty3"
        android:layout_toRightOf="@+id/loading_empty3"
        android:background="@drawable/updating4"
        android:layout_marginRight="15dp"
        android:src="@drawable/loading_empty" />

    <ImageView
        android:id="@+id/loading_empty5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/loading_empty4"
        android:layout_toRightOf="@+id/loading_empty4"
        android:background="@drawable/updating5"
        android:src="@drawable/loading_empty" />

</RelativeLayout>

2 个答案:

答案 0 :(得分:2)

为什么不为此使用动画列表? 4个点作为1个图像,动画列表中的每个项目作为动画中的一个帧?

喜欢这个http://android-er.blogspot.com/2012/01/create-frame-animation-with.html

答案 1 :(得分:1)

这可以使用Android的单个ImageViewanimation-listAnimationDrawable类来完成。

  • drawable文件夹中复制五张图片。
  • drawable。{/ li>的animation-list文件夹中创建XML文件
  • 列出此xml文件中的所有五个图像。
  • 在xml文件中设置每个Image的动画持续时间。
  • 将您的xml文件设置为ImageView
  • 中的图像资源
  • 使用getDrawable()从xml获取每张图片。
  • 启动动画。

例如,假设您创建了五个点的图像,其名称为 dot01.png,dot02.png,dot03.png,dot04.png,dot05..png ,然后是{{{x>文件中的xml文件1}}文件夹应该是,

drawable

现在将xml设置为<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/dot01" android:duration="150"/> <item android:drawable="@drawable/dot02" android:duration="150"/> <item android:drawable="@drawable/dot03" android:duration="150"/> <item android:drawable="@drawable/dot04" android:duration="150"/> <item android:drawable="@drawable/dot05" android:duration="150"/> <!-- Reset to original --> <item android:drawable="@drawable/dot01" android:duration="10"/> </animation-list> 中的图像资源,然后从ImageView实例的start()方法启动动画,

AnimationDrawable

上面的代码可以工作,但它只会使图像动画一次,这是因为android中的一个错误,android认为动画即使已经结束也仍在运行。解决方案是使用ImageView DotAnimImage = (ImageView) findViewById(R.id.imageView1); // dots_animation below is the name of your xml file. DotAnimImage.setImageResource(R.drawable.dots_animation); // Now create a reference to getDrawable AnimationDrawable dotsAnimation = (AnimationDrawable) DotAnimImage.getDrawable(); // Start animation dotsAnimation.start(); 实例的isRunning()方法检查动画是否正在运行,并使用AndroidDrawable方法手动停止它,

stop()

你的最终代码应该是,

//Check if animation is running and stop it,
if (dotsAnimation.isRunning()) {
    dotsAnimation.stop();
    // start again,
    dotsAnimation.start();
}