android中的逐帧动画

本文介绍如何在Android中实现逐帧动画效果,包括创建动画文件、在代码中加载并控制动画播放的方法,以及如何根据需求启动或停止动画。

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




android与逐帧动画:

效果图:

效果图

当我们点击按钮时,该图片会不停的运动,当再次点击按钮时,会停止在当前的状态。

或者

一开始时,图片就会不停的运动.




activity代码:

package com.nj.test;

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

/**
 * 
 * @description android中的逐帧动画. 
 * 逐帧动画的原理很简单,跟电影的播放一样,一张张类似的图片不停的切换,当切换速度达到一定值时, 
 * 我们的视觉就会出现残影,残影的出现保证了视觉上变化的连续性,这时候图片的切换看在我们眼中就跟真实的一样了。 
 * 想使用逐帧动画: 
 * 第一步:需要在res/drawable文件夹下新建一个xml文件,该文件详细定义了动画播放时所用的图片、切换每张图片 
 *        所用的时间、是否为连续播放等等。(有些文章说,在res/anim文件夹下放置该文件,事实证明,会出错哦) 
 * 第二步:在代码中,将该动画布局文件,赋值给特定的图片展示控件,如本例子中的ImageView。 
 * 第三步:通过imageView.getBackGround()获取相应的AnimationDrawable对象,然后通过该对象的方法进行控制动画 
 */
public class ExamplesActivity extends Activity {
    
    private ImageView imageViewNumber,imageViewRole;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        imageViewNumber = (ImageView) findViewById(R.id.imageView_animation1);  
        imageViewNumber.setBackgroundResource(R.drawable.number_animation_drawable);  
        
        imageViewRole = (ImageView) findViewById(R.id.imageView_role);
        imageViewRole.setBackgroundResource(R.drawable.role_animation_drawable); 
          
    }  
      
      
    public void myClickHandler(View targetButton){  
        // 获取AnimationDrawable对象  
        AnimationDrawable animationDrawable = (AnimationDrawable)imageViewNumber.getBackground();  
          
       
        AnimationDrawable animationDrawable2 = (AnimationDrawable)imageViewRole.getBackground(); 
        // 动画是否正在运行  
        if(animationDrawable.isRunning()){  
            //停止动画播放  
            animationDrawable.stop();  
        }  
        else if(!animationDrawable.isRunning()){  
            //开始或者继续动画播放  
            animationDrawable.start();  
        }  
        // 动画是否正在运行  
        if(animationDrawable2.isRunning()){  
            //停止动画播放  
        	animationDrawable2.stop();  
        }  
        else if(!animationDrawable2.isRunning()){  
            //开始或者继续动画播放  
        	animationDrawable2.start();  
        }  
          
          
    } 
    
    /***
     * 一开始就运动
     */
    public void onWindowFocusChanged(boolean hasFocus) {
    	// 获取AnimationDrawable对象  
        AnimationDrawable animation1 = (AnimationDrawable)imageViewNumber.getBackground();
        AnimationDrawable animation2 = (AnimationDrawable)imageViewRole.getBackground();
    	super.onWindowFocusChanged(hasFocus);
    	if(hasFocus){
    		animation1.start();
    		animation2.start();
    	}else{
    		animation1.stop();
    		animation2.stop();
    	}
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content" android:layout_height="wrap_content"
	android:orientation="vertical">
	<Button  
	    android:id="@+id/button_animation1" 
	    android:text="动画开始"
		android:layout_gravity="center_horizontal" 
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:onClick="myClickHandler"></Button>
	<ImageView 
	    android:id="@+id/imageView_animation1"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content" 
		android:layout_weight="1"></ImageView>
	<ImageView
	    android:id ="@+id/imageView_role"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_marginTop="50dp"
	    />
</LinearLayout>


number_animation_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度
	
	每个item就是一帧,drawable是该帧显示的图片,duration是显示时间,
	android:oneshot=”false”表示动画一直进行,若为true则表示只播放一次动画
 -->
<animation-list
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false"
  >
  	<item android:drawable="@drawable/number0" android:duration="50"></item>
  	<item android:drawable="@drawable/number1" android:duration="50"></item>
  	<item android:drawable="@drawable/number2" android:duration="50"></item>
  	<item android:drawable="@drawable/number3" android:duration="50"></item>
  	<item android:drawable="@drawable/number4" android:duration="50"></item>
  	<item android:drawable="@drawable/number5" android:duration="50"></item>
</animation-list>


role_animation_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度
	
	每个item就是一帧,drawable是该帧显示的图片,duration是显示时间,
	android:oneshot=”false”表示动画一直进行,若为true则表示只播放一次动画
 -->
<animation-list
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false"
  >
  	<item android:drawable="@drawable/role1" android:duration="60"></item>
  	<item android:drawable="@drawable/role2" android:duration="60"></item>
  	<item android:drawable="@drawable/role3" android:duration="60"></item>
  	<item android:drawable="@drawable/role4" android:duration="60"></item>
</animation-list>


资源下载地址:http://download.youkuaiyun.com/detail/niejing654092427/3880651



例子2:



第一步:先上图片素材,以下素材放到res/drawable目录下:

图片素材:

文件名称:

wifi1.png

wif2.png

wifi3.png

wifi4.png

wifi5.png


wifi6.png



第二步:上动画Animation-list帧布局文件,有2个,一个是按顺序显示动画,一个是倒序显示动画,文件存放在res/anim目录下

顺序显示动画文件:animation1.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度

-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >

    <item
        android:drawable="@drawable/wifi1"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi2"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi3"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi4"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi5"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi6"
        android:duration="150">
    </item>

</animation-list>

倒序显示动画文件:animation2.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度

-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >

    <item
        android:drawable="@drawable/wifi6"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi5"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi4"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi3"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi2"
        android:duration="150">
    </item>
    <item
        android:drawable="@drawable/wifi1"
        android:duration="150">
    </item>

</animation-list>

第三步:上布局文件,放在res/layout目录下,文件名activity_main.xml

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

    <ImageView
        android:id="@+id/animationIV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5px"
        android:src="@drawable/animation1" />

    <Button
        android:id="@+id/one_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5px"
        android:text="顺序显示" />

    <Button
        android:id="@+id/stop_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5px"
        android:text="停止" />

    <Button
        android:id="@+id/two_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5px"
        android:text="倒序显示" />

</LinearLayout>

第四步:上Activity文件,文件名:MainActivity.java

package com.example.animation;

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

public class MainActivity extends Activity
{
    private ImageView animationIV;
    private Button buttonA, stopBtn, buttonC;
    private AnimationDrawable animationDrawable;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
       
        
        animationIV = (ImageView) findViewById(R.id.animationIV);
        buttonA = (Button) findViewById(R.id.one_btn);
        stopBtn = (Button) findViewById(R.id.stop_btn);
        buttonC = (Button) findViewById(R.id.two_btn);
        
        buttonA.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                animationIV.setImageResource(R.drawable.animation1);
                animationDrawable = (AnimationDrawable) animationIV.getDrawable();
                animationDrawable.start();
            }
            
        }); 
        
        stopBtn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                animationDrawable = (AnimationDrawable) animationIV.getDrawable();
                animationDrawable.stop();
            }
            
        });
        
        buttonC.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                animationIV.setImageResource(R.drawable.animation2);
                animationDrawable = (AnimationDrawable) animationIV.getDrawable();
                animationDrawable.start();
            }           
        });        
    }
}


资源下载地址: http://download.youkuaiyun.com/detail/niejing654092427/5540011


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值