标签: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