码迷,mamicode.com
首页 > 其他好文 > 详细

实现动画暂停播放

时间:2015-04-18 10:08:38      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:android   动画暂停   动画播放   高仿360雷达扫描   

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

功能非常简单,但实现起来却没想像中的那么简单,如果不用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();// 判断动画是否在跑
	}

}


实现动画暂停播放

标签:android   动画暂停   动画播放   高仿360雷达扫描   

原文地址:http://blog.csdn.net/ytmfdw/article/details/45110535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!