垃圾清理动画
?這篇博客給大家?guī)硪粋€(gè)簡單的功能實(shí)現(xiàn),在垃圾掃描的同時(shí)加入動(dòng)畫,接到的需求是 滑塊2秒滑過去,掉頭反轉(zhuǎn),2s滑回來,停頓0.8s在次反轉(zhuǎn),重新開始循環(huán)。好了就拿這個(gè)比較簡單的動(dòng)畫需求實(shí)現(xiàn)來作為我的第一篇博客,動(dòng)畫的效果類似于這種:
?這個(gè)動(dòng)畫需求的難點(diǎn)是 循環(huán)中的圖片的反轉(zhuǎn),如果采用roation動(dòng)畫反轉(zhuǎn),不管setDuration(xxx) 時(shí)間設(shè)置的再短,還是不會(huì)達(dá)到立馬反轉(zhuǎn)的效果,所以我們考慮 ImageView的 一個(gè)屬性方法 setRoation(180) setRoation(0)這個(gè)方法可以使圖片立即反轉(zhuǎn) 180度。接下來我們看代碼的實(shí)現(xiàn):
?
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滑塊資源文件,我會(huì)在博客結(jié)尾上傳給大家,?ObjectAnimator.ofFloat()屬性動(dòng)畫的實(shí)現(xiàn),依次傳入4個(gè)參數(shù),簡單來講第一個(gè)參數(shù):你需要做動(dòng)畫的控件,第二個(gè)參數(shù):你想對控件的什么屬性做動(dòng)畫,第三個(gè)參數(shù):屬性開始的狀態(tài)(不同的屬性會(huì)有所不同),第四個(gè)參數(shù):屬性結(jié)束的狀態(tài)。
?
?
int screenWidth = DeviceUtil.getScreenWidth(); int width = slipperImage.getWidth();分析清楚位移的距離 為滑塊本身的長度+屏幕的寬度,在這里需要注意的是 在獲取控件寬度的時(shí)候,布局文件中控件的Visibility屬性不能為gone,可以設(shè)置為invisible 或者將透明度設(shè)置為0,如果設(shè)置為gone的時(shí)候,控件會(huì)規(guī)避android的初始化測繪,也就是說布局的時(shí)候找不到你的控件,這時(shí)候你在獲取已經(jīng)設(shè)置為gone控件的寬度的時(shí)候就會(huì)得到0。這樣會(huì)影響你動(dòng)畫的實(shí)現(xiàn)。
?
?
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());設(shè)置位移動(dòng)畫的時(shí)間,插值器 LinearInterpolator()動(dòng)畫以常量速率來改變,
?
?
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(); }分別為兩個(gè)動(dòng)畫設(shè)置監(jiān)聽,開始從左邊滑動(dòng)到右邊,在動(dòng)畫結(jié)束的時(shí)候,圖片反轉(zhuǎn)180度 setRotation(180), 開始 右邊滑動(dòng)到左邊的動(dòng)畫,mAnimRightToLeft結(jié)束以后 圖片反轉(zhuǎn)回來 setRotation(0),在開啟 mAnimLeftToRight 這樣就形成了動(dòng)畫的循環(huán)。
?
?
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); }垃圾清理結(jié)束 動(dòng)畫也要隨之結(jié)束,這里要移除對動(dòng)畫的所有監(jiān)聽,因?yàn)槟闶强勘O(jiān)聽來循環(huán)動(dòng)畫的。這樣整個(gè)動(dòng)畫的流程就結(jié)束了,
?
?
<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>? 我的布局文件,垃圾清理的時(shí)候 滑塊的invisible變?yōu)関isible 垃圾清理結(jié)束,動(dòng)畫結(jié)束 滑塊的在變?yōu)閕nvisible, 另外android:layout_marginLeft = "-42dp" 將滑塊布局在屏幕可見寬度的左邊,這樣每次滑動(dòng)的時(shí)候 會(huì)有滑塊滑出屏幕的效果,在滑出來的時(shí)候,滑塊已經(jīng)反轉(zhuǎn)結(jié)束。
?
?下一篇博客我會(huì)給大家分析另外一種比較復(fù)雜的垃圾清理動(dòng)畫。
??
總結(jié)
- 上一篇: linux查询tomcat进程并杀死,L
- 下一篇: 618 系列篇丨电商平台大促之目标用户精