1. 程式人生 > >Android模仿QQ音樂播放旋轉的圓形ImageView

Android模仿QQ音樂播放旋轉的圓形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");
						}
					}
				}
			});

上張效果圖:



最後附上完整程式碼,有需要的可以下載研究。

點選下載