Android模仿QQ音樂播放旋轉的圓形ImageView
阿新 • • 發佈:2019-01-24
這裡會用到背景虛化和圓形的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"); } } } });
上張效果圖:
最後附上完整程式碼,有需要的可以下載研究。