实现动画暂停播放

想要实现的功能是:单击动画控件时,能暂停/播放

功能非常简单,但实现起来却没想像中的那么简单,如果不用android的动画,而是自己用线程开始动画,这种方式可以实现,但不推荐

我这里采用的是ObjectAnimator动画,至于这个动画的使用教程,请自行查阅相关资料

ObjectAnimator动画中,有三个方法:

objAnim.start();         动画开始,从你设置的起始点开始

objAnim.cancel();     动画取消,动画停在当前位置

objAnim.end();          动画结束,动画停止在起始位置

一切看起来非常简单,但实现效果是:每次调用    objAnim.start()    时,动画都是从头开始,我要的效果是从上次运行的位置开始,

先说下实现原理:

ObjectAnimator可以监听当前动画执行的位置,我们可以把当前位置记录下来,当动画停止时,该值便会被保存,那么下次运行时,便以这个值为起点,这里以一个仿360雷达扫描为例:

我把该动画独立出来,做成一个控件,相关注释都有,项目下载地址:http://download.csdn.net/detail/ytmfdw/8605503

注意:项目中,没完成这个要求,请按以下代码修改。

package com.ytmfdw.radar;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;

@SuppressLint("NewApi")
public class Radar extends FrameLayout {
	public static final String TAG = "Radar";
	private ImageView im_scan;
	private ImageView im_dian;
	private AlphaAnimation animation2;

	private float currentValue = 0f;
	private ObjectAnimator objAnim = null;

	public Radar(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	public Radar(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
		// TODO Auto-generated constructor stub
	}

	public Radar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context);
	}

	@SuppressLint("NewApi")
	public void initView(Context context) {
		LayoutInflater.from(context).inflate(R.layout.radar, this);
		im_scan = (ImageView) findViewById(R.id.im_scan);
		im_dian = (ImageView) findViewById(R.id.im_dian);
		animation2 = new AlphaAnimation(0.0f, 1.0f);
		animation2.setDuration(3000);
		animation2.setRepeatCount(Animation.INFINITE);

		startAnimation();

	}

	@Override
	protected void onAttachedToWindow() {
		// TODO Auto-generated method stub
		super.onAttachedToWindow();
		// 当控件被加载到窗体中时,开始执行动画
		objAnim.start();
		im_dian.startAnimation(animation2);

	}

	/**
	 * 开始动画
	 * */
	@SuppressLint("NewApi")
	public void startAnimation() {

		// 设置动画,从上次停止位置开始,这里是顺时针旋转360度
		objAnim = ObjectAnimator.ofFloat(im_scan, "Rotation",
				currentValue - 360, currentValue);
		// 设置持续时间
		objAnim.setDuration(1000);
		// 设置循环播放
		objAnim.setRepeatCount(ObjectAnimator.INFINITE);
		// 设置动画监听
		objAnim.addUpdateListener(new AnimatorUpdateListener() {

			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				// TODO Auto-generated method stub
				// 监听动画执行的位置,以便下次开始时,从当前位置开始
				currentValue = (Float) animation.getAnimatedValue();

			}
		});
		objAnim.start();
		im_dian.startAnimation(animation2);
	}

	/**
	 * 停止动画
	 * */
	public void stopAnimation() {
		objAnim.end();
		im_dian.clearAnimation();
		currentValue = 0;// 重置起始位置
	}

	/**
	 * 暂停动画
	 * */
	@SuppressLint("NewApi")
	public void pauseAnimation() {
		objAnim.cancel();
		im_dian.clearAnimation();// 清除此ImageView身上的动画
	}

	@Override
	protected void onDetachedFromWindow() {
		// TODO Auto-generated method stub
		super.onDetachedFromWindow();
		// 控件被移除时,取消动画
		objAnim.cancel();
		im_scan.clearAnimation();// 清除此ImageView身上的动画
		im_dian.clearAnimation();// 清除此ImageView身上的动画
	}

	public boolean isRunning() {
		return objAnim.isRunning();// 判断动画是否在跑
	}

}
时间: 2024-12-19 07:40:44

实现动画暂停播放的相关文章

使用as3控制动画的播放与暂停

1.需要两个按钮元件 2.在属性面板为两个按钮元件分别命名为pausebutton与playButton 3.代码 stop(); pausebutton.visible = false; playButton.visible = true; function startMovie(event:MouseEvent):void { this.play(); playButton.visible = false; pausebutton.visible = true; } function sto

可控制GIF动画图片播放和暂停jQuery插件

gifplayer是一款可以控制GIF动画格式图片播放和暂停的jQuery插件.该jQuery插件使用简单,文件体积小.可用于控制任何GIF动画图片的开始播放和暂停播放. 要使用该GIF动画图片jquery插件,可以分为下面的五个步骤: 在你的页面中添加一个静态版本的GIF图片,格式为PNG.jpg等图片格式都可以. 在img标签中添加data-gif属性指向GIF动画图片,或者不写也可以. 在图片文件夹中放置.gif格式的图片和它的静态版本的图片,两个图片的名称要相同. 在你的页面中引入gif

[ActionScript 3.0] 如何控制加载swf动画的播放与暂停

此方法适用于用as 1.0或者as2.0以及as3.0编译的swf,因为as1.0和as2.0编译的swf是AVM1Movie类型,因此需要通过类ForcibleLoader.as将其转换为version 9以上的swf,注意,如果加载的swf是3.0代码编译的,且此swf用文档类编译,则文档类必须继承MovieClip,接下来看代码: 首先写一个加载swf的类SwfPlayer.as: 1 package com.views 2 { 3 import com.controls.utils.Fo

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab

android 逐帧动画的播放与播放结束操作对象

逐帧动画的xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 3 android:oneshot="true" > 4 5 <item 6 android:drawable="@drawabl

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十一节:骨骼动画模型播放控制

?? <使用Cocos2d-x 开发3D游戏>系列在线课程 第十一节:骨骼动画模型播放控制 视频地址:http://edu.csdn.net/course/attend/1330/20811 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:明天放出 课程截图: 实例工程演示: ?? ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

HTML5动画图片播放器 高端大气

我们见过很多图片播放插件(焦点图),很多都基于jQuery.今天介绍的HTML5图片播放器很特别,它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动.打散.重新组合等.这款HTML5动画图片播放器算得上是高端大气上档次. 在线演示源码下载 转载自:http://www.html5tricks.com/html5-image-player-with-animation.html HTML5动画图片播放器 高端大气

Android4.2.2启动动画前播放视频

首先声明測试平台为瑞芯微的rk3168,Android4.2.2,Android版本号非常重要,由于Android4.0和Android4.2.2的代码有些地方就有差别,并不通用! 首先接到任务不知怎样下手,由于我了解中Android启动时没有出现过播放视频的,特别是在启动动画之前,Linux企鹅之后,而动画也是一幅幅的图片,根本不是啥视频如mp4,3gp等! 由于启动动画时能够播放声音,并且上层应用的mediaplayer也能够播放声音,结合surface能够播放视频!这就是入口点~ 动画播放

Android游戏开发之游戏帧动画的播放与处理

带你走进游戏开发的世界之游戏帧动画的处理<ignore_js_op> 1.帧动画的原理 帧动画帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧的切换罢了.            如图所示:人物行走动画的实现方式, 4帧行走动画在播放区域 一帧一帧向左切换播放 给人们一种播放动画的假象 ,图片就动了起来, 很简单吧,其它三方向播放动画的方法类似我就不再一一举例