您的位置:首页 > 移动开发 > Android开发

实现动画暂停播放

2015-04-18 09:25 801 查看
想要实现的功能是:单击动画控件时,能暂停/播放

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息