`
1140566087
  • 浏览: 559157 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18530
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:314112
Group-logo
J2ME 基础学习课程集
浏览量:18737
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17581
社区版块
存档分类
最新评论

Android 之 Frame逐帧动画

阅读更多
Android 动画


Andorid 平台提供了两类动画:
一:Tween(补间动画),即通过对场景里面的对象不断做图像变化(平移、缩放、旋转)产生动画效果;
二:Frame(逐帧动画),即顺序播放事先准备好的图像,跟电影类似;

Frame动画:
实现:
  xml文件实现:
  编码实现:

举例:xml实现过程:

    定义xml文件,将该文件放在/res 下的anim或drawable目录中,文件名可以
作为资源ID 在代码中引用;
说明:<animation-list>元素是必须的,并且必须作为根元素,可以包含一个或
多个<item>元素;

<animation-list>属性:android:oneshot="" 是否循环播放,false表示循环,可选,默认false
<item>元素属性:android:drawble="" 指定此帧动画所对应的图片资源;
android:duration="" 代表此帧持续的时间,为整数,毫秒;

例如:

提示:图片资源的存放,根据帧图片的大小放大对应的资源目录中;


编码实现:
  * 创建AnimationDrawable 对象,装载xml动画文件;
  * 设置控件背景资源为对应的AnimationDrawable对象;

AnimationDrawable 类中方法的介绍:
start();  开始
stop();   停止
setAlpha(100);  设置帧动画的透明度 (0-255)
setOneShot(); 设置是否播放一遍帧动画;
isRunning();  是否正在播放
isOneShot();   是否只播放一遍
getNmberOfFrames();  返回帧动画的帧数,即<item> 标签数;
getFrame();  根据索引得到指定帧的Drawable对象; 索引0开始;
getDuration(); 获得指定帧停留时间;
addFrame(); 向AnimationDrawable对象中添加新的帧;




案例:小鸟飞翔,撞击并发出声音:


res/anim 下的动画文件:
<?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/bird00" android:duration="180"></item>
 	<item android:drawable="@drawable/bird01" android:duration="180"></item>
 	<item android:drawable="@drawable/bird02" android:duration="180"></item>
 	<item android:drawable="@drawable/bird03" android:duration="180"></item>
 	<item android:drawable="@drawable/bird04" android:duration="180"></item>
 	<item android:drawable="@drawable/bird05" android:duration="180"></item>
 	<item android:drawable="@drawable/bird06" android:duration="180"></item>
 	<item android:drawable="@drawable/bird07" android:duration="180"></item>
 	<item android:drawable="@drawable/bird08" android:duration="180"></item>
 	<item android:drawable="@drawable/bird09" android:duration="180"></item>
 	<item android:drawable="@drawable/bird10" android:duration="180"></item>
 	
 	
</animation-list>



布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <!-- 自定义控件 -->
    <com.sun.frame.MyImageView
        android:id="@+id/imageview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>



主程序入口:
package com.sun.frame;

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

public class MainActivity extends Activity {

	private ImageView imageview ;
	private AnimationDrawable ad; // 
	
	// 数据初始化
	public void init(){
		
		imageview = (ImageView) findViewById(R.id.imageview1);
	
	}
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
		imageview.setOnClickListener(listener);
	}
	
	// 点击事件监听器
	private View.OnClickListener listener = new View.OnClickListener() {
		public void onClick(View v) {
			
			if(ad.isRunning()){
				ad.stop();
			}else
			ad.start();
		}
	};

	/**
	 * Activity 呈现给用户的时候调用的
	 */
	public void onWindowFocusChanged(boolean hasFocus) {
		super.onWindowFocusChanged(hasFocus);
		ad = (AnimationDrawable) getResources().getDrawable(R.anim.frame);
		imageview.setBackgroundDrawable(ad);
	}
}


自定义视图控件,便于控制图片的变化:
package com.sun.frame;

import java.lang.reflect.Field;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.AnimationDrawable;
import android.media.AudioManager;
import android.media.SoundPool;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;

public class MyImageView extends ImageView {

	public AnimationDrawable animationDrawable;
	private Field field; // 领域对象
	private SoundPool sp;
	private int music;

	/**
	 * 初始化数据
	 * 
	 * @param context
	 * @param attrs
	 */
	public MyImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		Log.i("msg","MyImageView构造方法...");
		/* 参数:
		 * 1、 播放数据流的最大个数 
		 * 2、数据流类型
		 * 3、声音质量
		 */
		sp = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
		music = sp.load(context, R.raw.a2, 1);
		
//		Log.i("msg","MyImageView构造方法...");
	}

	/**
	 * 画一次图调用一次 功能:用于监听每帧动画的播放状态
	 */
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Log.i("msg", "onDraw()...");
		try {
			field = AnimationDrawable.class.getDeclaredField("mCurFrame");
			field.setAccessible(true); // 设置可以访问

			// 获取mCurFrame变量的当前值
			int curFrame = field.getInt(animationDrawable);
			if (curFrame == 29) {
				
				//animationDrawable.stop(); // 停止播放
				
				// 播放音乐特效
				sp.play(music, 1, 1, 0, 0, 1);
				Log.i("msg", "特效出来啦...");
				// 设置动画的播放位置
				//field.setInt(animationDrawable, 0); // 从0 开始
			}else{
				sp.pause(music);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}



对自定义控件的使用,以及对应的效果:
package com.sun.frame;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

/**
 * 自定义控件的使用
 * @author Administrator
 *
 *注意:在AnimationDrawable 类中有一个mCurFrame变量,int型,保存当前动画的
 *播放位置;改变量为私有的,所以只能通过反射机制读写private变量
 *
 */
public class UserFrameActivity extends Activity {

	private MyImageView image;
	private AnimationDrawable ad; // 控制动画
	private SoundPool sp ; //音效池 -- 小鸟叫
	private int music; // 音乐

	// 程序入口
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.code_frame);

		// 获取控件对象,该对象为自定义对象
		image = (MyImageView) findViewById(R.id.imageview1);
		image.setOnClickListener(listener);

		// 音效初始化
		sp = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
		music = sp.load(this, R.raw.a3,1); //加载音乐
		Log.i("msg", "onCreate()...");
	}


	/**
	 * Activity 呈现给用户时调用
	 */
	public void onWindowFocusChanged(boolean hasFocus) {
		// TODO Auto-generated method stub
		super.onWindowFocusChanged(hasFocus);
		Log.i("msg","UserFrameActivity.onWindowFocusChanged()...");
		image.setBackgroundResource(R.anim.frame_c); // 设置背景资源
		ad = (AnimationDrawable) image.getBackground();
		image.animationDrawable = ad; // 同步
		ad.start();
		sp.play(music, 1, 1, 0, -1, 1);
	}



	// 点击监听器
	private OnClickListener listener = new OnClickListener() {

		public void onClick(View v) {

			if(ad.isRunning()){
				ad.stop();
				sp.pause(music); // 停止音效	
				Log.i("msg", "音效停止了...");
			}else{
				ad.start();
				sp.resume(music); //(music, 1, 1, 0, -1, 1); // 播放音效
				Log.i("msg","开始播放音效了...");
			}
		}
	};
}
分享到:
评论

相关推荐

    Android Animation Frame逐帧动画2

    Android提供了多种动画类型,其中包括 Tween 补间动画和 Frame 逐帧动画。本篇文章将主要聚焦于Frame动画,这是一种通过连续显示不同帧图片来创建动画效果的技术。 **Frame动画原理:** Frame动画基于一系列连续的...

    Android Animation Frame逐帧动画

    Android提供了多种动画类型,其中包括 Tween 补间动画和 Frame 逐帧动画。本节我们将深入探讨Frame动画,这是一种将一系列静态图像连续播放以创建动态效果的技术。 **Frame动画的概念** Frame动画是Android中用于...

    android 逐帧动画实现 源码

    在Android开发中,逐帧动画是一种常见的动画效果,它通过连续播放一系列静态图像来创造出动态效果,类似于传统的电影制作方式。本源码着重探讨如何在Android应用中实现逐帧动画。 首先,我们要了解Android中的两种...

    android逐帧动画

    在Android平台上,逐帧动画是一种常见且直观的动画实现方式,尤其适用于创建简单的连续图像序列,比如行走、跳跃等动作效果。在这个特定的案例中,我们看到标题为“android逐帧动画”,描述提到有三张图片进行切换,...

    逐帧动画 资源

    下面我们将深入探讨如何在Android中实现逐帧动画,并了解相关知识点。 一、FrameAnimation简介 FrameAnimation是Android SDK提供的一种基于图像序列的动画机制,它通过在ImageView组件中连续显示一系列的静态图像来...

    android 逐帧动画

    "逐帧动画"是Android动画系统中的一个基础概念,尤其适用于创建连续动态效果,如人物行走、物体旋转等。本教程将深入探讨逐帧动画的工作原理、实现方式以及如何在实际项目中运用。 逐帧动画是一种通过连续播放一...

    Android逐帧(Frame)动画

    其中,"逐帧动画"(Frame Animation)是一种简单且常用的技术,适用于创建一系列连续的静态图像来模拟动态效果。本篇文章将深入探讨Android逐帧动画的概念、实现方式以及相关的实践技巧。 逐帧动画的工作原理类似于...

    Android 逐帧动画源码.zip

    在Android中,逐帧动画主要通过`Animation`类的子类`FrameAnimation`来实现。`FrameAnimation`会按照指定的时间间隔依次显示一系列的图像资源,形成连续的动画效果。以下将详细介绍如何使用Java语言在Android中创建...

    Android中实现一个简单的逐帧动画示例代码.zip

    Android提供了多种动画类型,包括补间动画(Tween Animation)、帧动画(Frame Animation)以及属性动画(Property Animation)。对于逐帧动画,我们主要关注帧动画,它适用于那些需要按照特定顺序播放一系列图片的...

    02_FrameAnimation逐帧动画Demo下载

    帧动画(Frame Animation)是Android系统提供的一种简单实现连续播放多张图片来创建动态效果的方式。这种技术尤其适用于制作类似旋转、弹跳、飘动等简单的动画效果。下面我们将深入探讨帧动画的概念、实现方式以及在...

    逐帧动画源码

    在Android开发中,逐帧动画是一种常见的2D动画形式,尤其适用于游戏开发或者复杂的动态效果展示。本资源“逐帧动画源码”旨在提供一个深入理解逐帧动画工作原理的实例,帮助开发者快速掌握Android系统中如何实现这种...

    Android源码——逐帧动画源码_new_70.zip

    在Android开发中,逐帧动画是一种常见的动画效果,它通过连续播放一系列静态图像来创造出动态效果,类似于传统的动画制作方式。这份"Android源码——逐帧动画源码_new_70.zip"压缩包可能包含了一个关于如何在Android...

    安卓Android源码——逐帧动画源码.zip

    在这个"安卓Android源码——逐帧动画源码.zip"压缩包中,包含了一段实现逐帧动画的源代码,以及相关的图片资源和说明文档。下面我们将深入探讨逐帧动画的概念、实现方式,以及如何通过源码进行理解和应用。 逐帧...

    逐帧动画入门

    本文将深入探讨“逐帧动画入门”这一主题,基于提供的标签和压缩文件名,我们可以推测这是关于Android平台上的一个学习资源,可能包含了一系列的源代码示例。 逐帧动画是一种常见的动画形式,它通过连续播放一系列...

    网上逐帧动画的资源修改后的积分变少

    在Android开发中,逐帧动画是一种常见的视觉效果,它通过连续播放一系列静态图像来创造动态效果,类似于传统的动画制作方式。这种技术广泛应用于游戏、应用界面的交互元素以及各种动态图标设计。本话题将深入探讨...

    Android下逐帧动画的Demo

    在Android开发中,逐帧动画(Frame Animation)是一种常见的实现简单动画效果的技术,它通过连续显示一系列静态图像来创建动态效果,类似于早期的电视动画。本Demo主要展示了如何在Android应用中实现逐帧动画,我们...

    Android 逐帧动画示例

    本示例主要关注的是逐帧动画(Frame-by-Frame Animation),这是一种常见的动画实现方式,尤其适用于创建连续的动态效果,如人物行走、物体翻转等。逐帧动画通过连续播放一系列静态图片来达到动态视觉效果。 在...

    Android 逐帧动画的小例子

    在Android中,帧动画(Frame Animation)是一种简单易用的动画形式,它通过连续播放一系列静态图像(帧)来创造出动画效果。这些帧通常保存为图片资源(如PNG或JPEG),然后在XML文件中定义它们的播放顺序和持续时间...

Global site tag (gtag.js) - Google Analytics