Android模仿QQ音乐播放旋转的圆形ImageView

这里会用到背景虚化和圆形的ImageView控件,可以参考我之前的博文。

背景虚化

圆形ImageView


首先继承AnimatorUpdateListener类,对控件状态进行更新,代码如下:

class MyAnimatorUpdateListener implements AnimatorUpdateListener {
	public MyAnimatorUpdateListener(ObjectAnimator animator) {
		this.animator = animator;
	}

	/**
	 * 暂停状态
	 */
	private boolean isPause = false;
	/**
	 * 是否已经暂停,如果一已经暂停,那么就不需要再次设置停止的一些事件和监听器了
	 */
	private boolean isPaused = false;

	private boolean isPlay = true;
	/**
	 * 当前的动画的播放位置
	 */
	private float fraction = 0.0f;
	/**
	 * 当前动画的播放运行时间
	 */
	private long mCurrentPlayTime = 0l;

	/**
	 * 是否是暂停状态
	 * 
	 * @return
	 */
	private ObjectAnimator animator;

	public boolean isPause() {
		return isPause;
	}

	public boolean isPlay() {
		return isPlay;
	}

	/**
	 * 停止方法,只是设置标志位,剩余的工作会根据状态位置在onAnimationUpdate进行操作
	 */
	public void pause() {
		isPause = true;
		isPlay = false;
	}

	public void play() {
		isPause = false;
		isPaused = false;
		isPlay = true;
	}

	@Override
	public void onAnimationUpdate(ValueAnimator animation) {
		/**
		 * 如果是暂停则将状态保持下来,并每个刷新动画的时间了;来设置当前时间,让动画
		 * 在时间上处于暂停状态,同时要设置一个静止的时间加速器,来保证动画不会抖动
		 */
		if (isPause) {
			if (!isPaused) {
				mCurrentPlayTime = animation.getCurrentPlayTime();
				fraction = animation.getAnimatedFraction();
				animation.setInterpolator(new TimeInterpolator() {
					@Override
					public float getInterpolation(float input) {
						return fraction;
					}
				});
				isPaused = true;
			}
			// 每隔动画播放的时间,我们都会将播放时间往回调整,以便重新播放的时候接着使用这个时间,同时也为了让整个动画不结束
			new CountDownTimer(ValueAnimator.getFrameDelay(),
					ValueAnimator.getFrameDelay()) {

				@Override
				public void onTick(long millisUntilFinished) {
				}

				@Override
				public void onFinish() {
					animator.setCurrentPlayTime(mCurrentPlayTime);
				}
			}.start();
		} else {
			// 将时间拦截器恢复成线性的,如果您有自己的,也可以在这里进行恢复
			animation.setInterpolator(null);
		}
	}
}

然后声明一个ObjectAnimator对象,一个MyAnimatorUpdateListener对象,核心使用代码如下:

LinearInterpolator lin = new LinearInterpolator();//声明为线性变化
			anim = ObjectAnimator.ofFloat(v, "rotation", 0f, 360f);//设置动画为旋转动画,角度是0-360
			anim.setDuration(15000);//时间15秒,这个可以自己酌情修改
			anim.setInterpolator(lin);
			anim.setRepeatMode(Animation.RESTART);//设置重复模式为重新开始
			anim.setRepeatCount(-1);//重复次数为-1,就是无限循环
			listener = new MyAnimatorUpdateListener(anim);//将定义好的ObjectAnimator传给MyAnimatorUpdateListener监听
			anim.addUpdateListener(listener);//给动画加监听
			bt.setOnClickListener(new View.OnClickListener() {

				@Override
				public void onClick(View arg0) {

					Button bt = (Button) arg0;

					if (isFirst) {//如果是第一次进入或者点击,开始动画
						anim.start();
						bt.setText("pause");
						isFirst = false;
					} else {

						if (listener.isPause()) {//不是第一次,则判断当前动画的状态,如果是播放就暂停........
							listener.play();
							bt.setText("pause");
						} else if (listener.isPlay()) {
							listener.pause();
							bt.setText("start");
						}
					}
				}
			});


上张效果图:




最后附上完整代码,有需要的可以下载研究。


点击下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值