赵雅智_android_frame动画

在开始实例讲解之前,先引用官方文档中的一段话:

Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可以完全编码实现。

如果被定义在XML文件中,我们可以放置在/res下的anim或drawable目录中(/res/[anim | drawable]/filename.xml),文件名可以作为资源ID在代码中引用;如果由完全由编码实现,我们需要使用到AnimationDrawable对象。

如果是将动画定义在XML文件中的话,语法如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>  
  1. 配置图片资源文件
  2. 在activity中实现frame动画

实例:

运行效果:

步骤

把图片放到res/drawable目录下

分别取名为:a1.png,a2.png,a3.png,a4.png,a5.png,a6.png。

在res/anim目录下创建一个XML配置文件

我们可以将frame.xml文件放置于drawable或anim目录,官方文档上是放到了drawable中了,大家可以根据喜好来放置,放在这两个目录都是可以运行的。

<?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="false">
    <item android:drawable="@drawable/a1" android:duration="1000"></item>
    <item android:drawable="@drawable/a2" android:duration="1000"></item>
    <item android:drawable="@drawable/a3" android:duration="1000"></item>
    <item android:drawable="@drawable/a4" android:duration="1000"></item>
    <item android:drawable="@drawable/a5" android:duration="1000"></item>
    <item android:drawable="@drawable/a6" android:duration="1000"></item>
</animation-list>
  • animation-list:动画的总标签,这里面放着帧动画 <item>标签

    • oneshot代表着是否只展示一遍

      • true 则表示动画只播发一次
      • false会不停的循环播放动画
  • item:记录着每一帧的信息,对动画中的每一个图片进行声明
    • android:drawable="@drawable/a"表示这一帧用的图片为"a",下面以此类推。
    • android:duration="1000" 表示这一帧持续1000毫秒,可以根据这个值来调节动画播放的速度

在res/layout目录下创建layout配置文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <Button
        android:id="@+id/btn_begin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView1"
        android:layout_marginTop="30dp"
        android:layout_toRightOf="@+id/btn_codeBegin"
        android:onClick="click"
        android:text="开始" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_begin"
        android:layout_marginRight="15dp"
        android:onClick="click"
        android:text="停止" />

    <RadioGroup
        android:id="@+id/rg_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_stop"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/rb_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="单次播放" />

        <RadioButton
            android:id="@+id/rb_more"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="循环播放" />
    </RadioGroup>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/rg_num"
        android:text="拖动进度条修改透明度(0 - 255)之间" />

    <SeekBar
        android:id="@+id/sb_alpha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1" />

    <Button
        android:id="@+id/btn_codeBegin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_stop"
        android:layout_marginRight="15dp"
        android:layout_toRightOf="@+id/btn_stop"
        android:text="代码_启动"
        android:onClick="click" />

</RelativeLayout>

Activity代码

package com.example.lession13_frame;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;

public class SplashActivity extends Activity {

	private ImageView imageView;
	private AnimationDrawable animationDrawable;
	private RadioGroup rgNum;
	private SeekBar sbalpha;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 帧动画
		imageView = (ImageView) findViewById(R.id.imageView1);
		rgNum = (RadioGroup) this.findViewById(R.id.rg_num);
		sbalpha = (SeekBar) this.findViewById(R.id.sb_alpha);

		// 第一种方式实现的动画
		/*
		 * animationDrawable = (AnimationDrawable)
		 * getResources().getDrawable(R.anim.framebyframe);
		 * imageView.setBackgroundDrawable(animationDrawable);
		 */

		// 第二种方式实现的动画
		// 设置背景资源
		imageView.setBackgroundResource(R.anim.framebyframe);
		animationDrawable = (AnimationDrawable) imageView.getBackground();

		// animationDrawable.setOneShot(false);是否循环播放
		// animationDrawable.stop();停止播放
		// animationDrawable.isRunning();//是否播放
		// animationDrawable.getNumberOfFrames();//播放帧
		// animationDrawable.getFrame(index); 返回制定索引的 Drawable对象
		// animationDrawable.getDuration(i);停留的时间

		rgNum.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				// TODO Auto-generated method stub
				if (checkedId == R.id.rb_one) {
					// 设置单次播放
					animationDrawable.setOneShot(true);
				} else if (checkedId == R.id.rb_more) {
					// 设置循环播放
					animationDrawable.setOneShot(false);
				}
				// 设置播放后重新启动
				animationDrawable.stop();
				animationDrawable.start();
			}
		});
		// 监听的进度条修改透明度
		sbalpha.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				// 设置动画Alpha值
				animationDrawable.setAlpha(progress);
				// 通知imageView 刷新屏幕
				imageView.postInvalidate();
			}
		});
	}

	public void click(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.btn_begin:
			animationDrawable.start();
			break;
		case R.id.btn_stop:
			animationDrawable.stop();
			break;

		case R.id.btn_codeBegin:
			Toast.makeText(getApplicationContext(), "------------------", 0)
					.show();
			// 完全编码实现的动画效果
			for (int i = 1; i <= 6; i++) {
				// 根据资源名称和目录获取R.java中对应的资源ID
				int picId = getResources().getIdentifier("a" + i, "drawable",
						getPackageName());
				// 根据资源ID获取到Drawable对象
				Drawable drawable = getResources().getDrawable(picId);
				// 将此帧添加到AnimationDrawable中
				animationDrawable.addFrame(drawable, 300);
			}
			animationDrawable.setOneShot(false); // 设置为loop
			imageView.setBackgroundDrawable(animationDrawable); // 将动画设置为ImageView背景
			animationDrawable.start(); // 开始动画

			break;

		default:
			break;
		}
	}
}

AnimationDrawable 就是用来控制这个帧动画,这个类中提供了很多方法。

  • animationDrawable.start(); 开始这个动画
  • animationDrawable.stop(); 结束这个动画
  • animationDrawable.setAlpha(100);设置动画的透明度, 取值范围(0 - 255)
  • animationDrawable.setOneShot(true); 设置单次播放
  • animationDrawable.setOneShot(false); 设置循环播放
  • animationDrawable.isRunning(); 判断动画是否正在播放
  • animationDrawable.getNumberOfFrames(); 得到动画的帧数。

拖动进度条设置Alpha值的时候 一定要使用     imageView.postInvalidate(); 方法来通知UI线程重绘屏幕中的imageView  否则会看不到透明的效果 。

纯代码实现:

//完全编码实现的动画效果
		        for (int i = 1; i <= 6; i++) {
		            //根据资源名称和目录获取R.java中对应的资源ID
		            int picId = getResources().getIdentifier("a" + i, "drawable", getPackageName());
		            //根据资源ID获取到Drawable对象
		            Drawable drawable = getResources().getDrawable(picId);
		            //将此帧添加到AnimationDrawable中
		            animationDrawable.addFrame(drawable, 300);
		        }
		        animationDrawable.setOneShot(false); //设置为loop
		        imageView.setBackgroundDrawable(animationDrawable);  //将动画设置为ImageView背景
		        animationDrawable.start();   //开始动画  

			break;
			

赵雅智_android_frame动画

时间: 2024-12-07 15:50:37

赵雅智_android_frame动画的相关文章

赵雅智_Tween动画(旋转、平移、放缩和渐变)

Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). Tweene Animations. 主要类 Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 TranslateAnimation 位置移动 AnimationSet  动画集 该View很简单,画面上只有一个图片. 现在我们要对整个View分别实现各种Tween动画效果. AlphaAnim

赵雅智_Android_Canvas

Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0. android.graphics和android.graphics.drawable包 大部分2D使用的api都在android.graphics和android.graphics.drawable包中. 他们提供了图形处理相关的: Canvas.ColorFilter.Point(点)和RetcF(矩形)等 还有一些动画相关的:AnimationDrawable. Bit

赵雅智:android教学大纲

带下划线为具体内容链接地址,点击后可跳转,希望给大家尽一些微薄之力,目前还在整理中 教学章节 教学内容 学时安排 备注 1 Android快速入门 2 Android模拟器与常见命令 3 Android用户界面设计 4 Android网络通信及开源框架引用 5 线程与消息处理 6 数据存储及访问 7 Android基本单元应用activity 8 Android应用核心Intent 9 资源访问 10 ContentProvider实现数据共享 11 BroadcastReceiver 12 S

赵雅智_android多线程下载带进度条

progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度.一个进度条也可不确定其进度.在不确定模式下,进度条显示循环动画.这种模式常用于应用程序使用任务的长度是未知的. XML重要属性 android:progressBarStyle:默认进度条样式 android:progressBarStyleHorizontal:水平样式 progressBar重要方法 getMax():返回这个进度条的范围的

赵雅智_Android Paint

要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: setAntiAlias: 设置画笔的锯齿效果. setColor: 设置画笔颜色 setARGB:  设置画笔的a,r,p,g值. setAlpha:  设置Alpha值 setTextSize: 设置字体尺寸. setStyle:  设置画笔风格,空心或者实心. setStrokeWidth: 设置

赵雅智_splash启动界面

项目需求 设置初始化界面并实现界面跳转 步骤 启动界面主题设置为全屏 设置背景资源 实现开启动画和跳转 实现效果 具体代码 style.xml <resources> <style name="AppBaseTheme" parent="android:Theme.Light"> </style> <!-- Application theme. --> <style name="AppTheme&quo

赵雅智_名片夹(2)_自动登录

功能介绍:刚安装应用的时候进行登录,当用户开启自动登录的时候,进入程序自动进入主界面 LoginAct.java package com.cards.activity; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import com.c

赵雅智:js知识点汇总

赵雅智:js知识点汇总,布布扣,bubuko.com

赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印

上一篇已经介绍了Android种Bitmap和Canvas的使用,下面我们来写一个具体实例 http://blog.csdn.net/zhaoyazhi2129/article/details/32136179 运行效果: 主要代码 package com.example.guaguale; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import and