日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

垃圾清理动画

發布時間:2024/3/24 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 垃圾清理动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?這篇博客給大家帶來一個簡單的功能實現,在垃圾掃描的同時加入動畫,接到的需求是 滑塊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" 將滑塊布局在屏幕可見寬度的左邊,這樣每次滑動的時候 會有滑塊滑出屏幕的效果,在滑出來的時候,滑塊已經反轉結束。

?

?下一篇博客我會給大家分析另外一種比較復雜的垃圾清理動畫。

??

總結

以上是生活随笔為你收集整理的垃圾清理动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。