AnimationにおけるfillAfter,fillBefore,fillEnabledの理解

4367 ワード

Animation
Animationは抽象クラスであり,その直接サブクラスにはAlphaAnimation,ScaleAnimation,RotateAnimation,TranslateAnimation,AnimationSetがある.
Animationが持つ属性は以下のとおりです.
android:duration                 ,       
android:fillAfter                         ,     true,       ,                                      , false     
android:fillBefore                  ,View      ;                                               startAnimation  ,               。                                       startAnimation        ,     startOffset  , 
                           fillBefore true,  startOffset   ,           ,
                            false,  View      。
android:fillEnabled            fillBefore      ,  true, fillBefore  ;  false
                                fillBefore true  false,     。  ,    , 
                           fillEnabled false ,    fillBefore true。    ,                                    fillEnabled false ,  fillBefore    , startOffset  
                                           。
android:repeatCount            
android:repeatMode             , reverse restart   ,reverse      ,restart                                  ,   repeatCount          。                                        ,       。
android:interpolator            ,           ,       。

本文は主にfillAfter、fillBefore、fillEnabledの3つの関係を話して、実は上はすでにはっきり言って、もし表現がはっきりしないならば、また指摘して、ありがとうございます.結論はすでに出ていて、慣例に従って、やはり例をあげて、印象を深めます.以下、上記の結論を2つの例で証明します.ルートノードは単一のアニメーションで、ルートノードは結合アニメーションです.
ScaleAnimation
src/main/res/anim/scaleanim.xml



Javaコードで任意のビューオブジェクトをインスタンス化します.私のビューオブジェクトtargetViewは、次のようになります.
Animation animation = AnimationUtils.loadAnimation(context,R.anim.scaleanim);
targetView.startAnimation(animation);

オフセットの時間量は3秒、つまりアニメーションが本格的に始まる時間はstartAnimationメソッドを呼び出す3秒後です.そして3秒の間、Viewはどのような状態なのか、例ではfillEnabledがtrueであることがわかりますので、fillBeforeは有効であり、fillBeforeはfalseなので、最終的に実行した結果、loadAnimationが呼び出された後、ViewはView自体の初期サイズを2倍に拡大することなく、3秒続くとすぐに元の2倍になります.その後、アニメーションを開始し、徐々に元の3倍に変更し、初期サイズに戻り、アニメーションを停止します.
ここではfillAfterは設定されていませんが、fillAfterは実際にfillBeforeやfillEnabledとは何の関係もありません.fillAfterのデフォルト値はfalseなので、アニメーションが終了すると元のサイズに戻ります.
FillBefore、fillEnabledはいったいどこで使われているのか、次の例を見てみましょう
AnimationSet


    
    


コンビネーションアニメーションでは、fillBefore、fillEnabledを設定することで、あなたが望む効果を保証することができます.View 0.5 2 , 90 720 が必要です.どうすればいいですか.上のfillEnabled、fillBeforeを削除すると、アニメーションはどのような効果がありますか?
なお、Animationソースコードでは、fillAfterのデフォルト値がfalse、fillBeforeのデフォルト値がtrue、fillEnabledのデフォルト値がfalseであることがわかります.これらの値を設定しない場合は、デフォルトです.fillEnabledがfalseの場合、fillBeforeの値はどうでもいいですが、fillBeforeがtrueであると仮定します.だから fillBefore,fillEnabled の結果は: View 90 , View , 1 View 2 , , 2 720 , View です.
目的の効果を達成するには、fillEnabled、fillEnabledを設定することで実現できます.ビューは、まず元の位置で0.5倍から2倍に拡大し、つまりこのときビューの初期状態が90度回転できない場合、rotateラベルの中でfillEnabledをtrueに設定します.fillBefore、fillAfterはsetラベルに設定されているからです.View 0.5 2 は、ビューの初期サイズがビュー自体のサイズの0.5倍であることを示す.したがって、fillEnabledをfalseに設定します.fillEnabledがfalseであるため、fillEnabledはfillEnabledに相当し、fillBeforeは同時にtrueの効果です.
まとめてみると、fillEnabled false、fillBefore anyfillEnabled true fillBefore trueに相当します.
通常、setのラベルでfillBeforeをfalseに設定し、アニメーションノードでfillEnabledを設定してstartOffsetフェーズで所定の初期値が使用されるかどうかを決定します.