垃圾清理动画
?這篇博客給大家帶來一個簡單的功能實現,在垃圾掃描的同時加入動畫,接到的需求是 滑塊2秒滑過去,掉頭反轉,2s滑回來,停頓0.8s在次反轉,重新開始循環。好了就拿這個比較簡單的動畫需求實現來作為我的第一篇博客,動畫的效果類似于這種:
?這個動畫需求的難點是 循環中的圖片的反轉,如果采用roation動畫反轉,不管setDuration(xxx) 時間設置的再短,還是不會達到立馬反轉的效果,所以我們考慮 ImageView的 一個屬性方法 setRoation(180) setRoation(0)這個方法可以使圖片立即反轉 180度。接下來我們看代碼的實現:
?
private void startCleanAnim() {ImageView slipperImage = (ImageView) findViewById(R.id.iv_slipper);slipperImage.setVisibility(View.VISIBLE);int screenWidth = DeviceUtil.getScreenWidth();int width = slipperImage.getWidth();mAnimLeftToRight = ObjectAnimator.ofFloat(slipperImage, "x", -width, screenWidth);mAnimLeftToRight.setDuration(2000);mAnimLeftToRight.setInterpolator(new LinearInterpolator());mAnimRightToLeft = ObjectAnimator.ofFloat(slipperImage, "x", screenWidth, -width);mAnimRightToLeft.setDuration(2000);mAnimRightToLeft.setInterpolator(new LinearInterpolator());mAnimLeftToRight.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {findViewById(R.id.iv_slipper).setRotation(180);mAnimRightToLeft.start();}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});mAnimRightToLeft.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {findViewById(R.id.iv_slipper).setRotation(0);mAnimLeftToRight.setStartDelay(800);mAnimLeftToRight.start();}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});mAnimLeftToRight.start(); } private void stopCleanAnim(){if (mAnimRightToLeft != null){mAnimRightToLeft.cancel();mAnimRightToLeft.removeAllListeners();}if (mAnimLeftToRight != null){mAnimLeftToRight.cancel();mAnimLeftToRight.removeAllListeners();}findViewById(R.id.iv_slipper).clearAnimation();findViewById(R.id.iv_slipper).setVisibility(View.INVISIBLE); } }? iv_slipper滑塊資源文件,我會在博客結尾上傳給大家,?ObjectAnimator.ofFloat()屬性動畫的實現,依次傳入4個參數,簡單來講第一個參數:你需要做動畫的控件,第二個參數:你想對控件的什么屬性做動畫,第三個參數:屬性開始的狀態(不同的屬性會有所不同),第四個參數:屬性結束的狀態。
?
?
int screenWidth = DeviceUtil.getScreenWidth(); int width = slipperImage.getWidth();分析清楚位移的距離 為滑塊本身的長度+屏幕的寬度,在這里需要注意的是 在獲取控件寬度的時候,布局文件中控件的Visibility屬性不能為gone,可以設置為invisible 或者將透明度設置為0,如果設置為gone的時候,控件會規避android的初始化測繪,也就是說布局的時候找不到你的控件,這時候你在獲取已經設置為gone控件的寬度的時候就會得到0。這樣會影響你動畫的實現。
?
?
mAnimLeftToRight = ObjectAnimator.ofFloat(slipperImage, "x", -width, screenWidth); mAnimLeftToRight.setDuration(2000); mAnimLeftToRight.setInterpolator(new LinearInterpolator());mAnimRightToLeft = ObjectAnimator.ofFloat(slipperImage, "x", screenWidth, -width); mAnimRightToLeft.setDuration(2000); mAnimRightToLeft.setInterpolator(new LinearInterpolator());設置位移動畫的時間,插值器 LinearInterpolator()動畫以常量速率來改變,
?
?
mAnimLeftToRight.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {findViewById(R.id.iv_slipper).setRotation(180);mAnimRightToLeft.start();}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});mAnimRightToLeft.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {findViewById(R.id.iv_slipper).setRotation(0);mAnimLeftToRight.setStartDelay(800);mAnimLeftToRight.start();}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});mAnimLeftToRight.start(); }分別為兩個動畫設置監聽,開始從左邊滑動到右邊,在動畫結束的時候,圖片反轉180度 setRotation(180), 開始 右邊滑動到左邊的動畫,mAnimRightToLeft結束以后 圖片反轉回來 setRotation(0),在開啟 mAnimLeftToRight 這樣就形成了動畫的循環。
?
?
private void stopCleanAnim(){if (mAnimRightToLeft != null){mAnimRightToLeft.cancel();mAnimRightToLeft.removeAllListeners();}if (mAnimLeftToRight != null){mAnimLeftToRight.cancel();mAnimLeftToRight.removeAllListeners();}findViewById(R.id.iv_slipper).clearAnimation();findViewById(R.id.iv_slipper).setVisibility(View.INVISIBLE); }垃圾清理結束 動畫也要隨之結束,這里要移除對動畫的所有監聽,因為你是靠監聽來循環動畫的。這樣整個動畫的流程就結束了,
?
?
<LinearLayoutandroid:id="@+id/layout_anim_linear"android:layout_width="match_parent"android:layout_height="8dp"android:orientation="horizontal"android:layout_alignParentBottom="true"><ImageViewandroid:id="@+id/iv_slipper"android:layout_width="42dp"android:layout_height="8dp"android:layout_marginLeft="-42dp"android:visibility="invisible"android:background="@drawable/huakuai"/> </LinearLayout>? 我的布局文件,垃圾清理的時候 滑塊的invisible變為visible 垃圾清理結束,動畫結束 滑塊的在變為invisible, 另外android:layout_marginLeft = "-42dp" 將滑塊布局在屏幕可見寬度的左邊,這樣每次滑動的時候 會有滑塊滑出屏幕的效果,在滑出來的時候,滑塊已經反轉結束。
?
?下一篇博客我會給大家分析另外一種比較復雜的垃圾清理動畫。
??
總結
- 上一篇: linux查询tomcat进程并杀死,L
- 下一篇: 618 系列篇丨电商平台大促之目标用户精