实现动画暂停播放

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

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

}


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ytmfdw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值