Animation 基本用法在我原來初學andorid時候講過http://www.cnblogs.com/bokeofzp/p/4759030.html,基本方法有2種:1、res文件中創建anim文件夾,並添加XMl設置animation屬性,2、代碼中動態設置。但在做項目中設計到了一個需求,就是當圖片在縮放到0.5f的時候需要開始旋轉和平移圖片。
這里我們不能簡單的定義一個縮放動畫和一個旋轉動畫然后同時啟動這2個動畫來達到想要的效果。
當然我們也可以利用上面的方式來解決:
1、寫一個動畫,從0-0.5的縮放。
2、在上面的動畫添加監聽事件,當結束的時候添加一個旋轉動畫,並且 還得再添加一個縮放動畫,從0.5f縮放到1f。
通過上面的方式可以完成,但總感覺怪怪的,為了更精確的讓圖片在多大時候執行什么事情,或者其他的動畫,在旋轉多少度的時候做什么事情,查了一些資料,發現android還提供了一個動畫類:ValueAnimator。
大致用法其實和Animation的用法差不多,給出一個方法,實現的是當圖片縮放到1的時候回縮到0.95,產生一個效果(注意注釋里需要注意的地方):
//縮放的變化動畫 public static void scaleAnimate(final View view , float start , final float end , final int duration) { final ValueAnimator valueAnimator = ValueAnimator.ofFloat(start , end); valueAnimator.setDuration(duration); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //這里在值變化的時候做相應的動作,我們是縮放圖片,注意先設置縮放的起始點,坐標都是以view的左上角為原點 float value = (float) animation.getAnimatedValue(); view.setPivotX(view.getWidth()/2); view.setPivotY(view.getHeight()/2); view.setScaleX(value); view.setScaleY(value); } }); //動畫完成后有個縮小的動作 valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { //這里寫是有問題的,遞歸調用會重新啟動監聽,然后又會啟動,因為動畫只啟動一次的緣故,但是會持續執行onUpdateListener,且value值一直是0.95 // scaleAnimate(view, end, 0.95f, duration / 3); ScaleAnimation scaleAnimation = new ScaleAnimation(1 , 0.95f , 1 , 0.95f , view.getWidth()/2 , view.getHeight()/2); scaleAnimation.setDuration(duration); scaleAnimation.setFillAfter(true);//這是保證動畫后的效果,不然會恢復到原來大小。 view.startAnimation(scaleAnimation); } }); valueAnimator.start(); }
ValueAnimator.ofFloat(start , end);來返回一個ValueAnimate對象,其實還有相應的ofInt,ofArgb、ofObject、ofPropertyValuesHolder等,它主要是可以在設置了動畫的變化參數后,精確的在動畫變化的時候控制動畫做我們想做的事情。
ps:當連續調用2次旋轉動畫的時候第一次從0-90,第二次是90-180,發現直接執行第二次動畫,第一次就忽略。