Androidアニメーション(Viewアニメーション、フレームアニメーション、属性アニメーション)の詳細を紹介します。


0.はじめに 
Androidアニメは面接の時によく聞かれる話題です。私たちはAndroidアニメには三つの種類があることを知っています。Viewアニメ、フレームアニメーション、属性アニメーションです。
まずこの三つのアニメについて概説を行います。
ビューアニメーションは漸進的なアニメーションで、画像の並進、スケーリング、回転、透明度などの様々な漸進的な変換によってアニメーション効果を達成します。
フレームアニメーションは、画像を絶え間なく切り替えてアニメーション効果を実現します。
属性アニメーションは、オブジェクトの属性を変更してアニメーション効果を実現します。この文章はオリジナルです。転載は出典を明記してください。
http://blog.csdn.net/seu_calvin/articale/detail/52724655
1.  動画リスト 
1.1  システムが提供する4種類のViewアニメーション(補間アニメーション)
Viewアニメーションは、res/anim/name.xmlファイルに配置され、4種類のViewアニメーションのグラデーション変換は、それぞれ「translate」、「scale」、「rotate」、「alpha」の4つのタグに対応しています。xmlのそれぞれのアニメーションの属性は比較的に簡単で、ここでもう実例のコードを貼りません。設定されたxmlファイルを使ってアニメーションを起動する方法に注意してください。
view.startAnimation(AnimationUtils.loadAnimation); 
これらはもちろんJavaコードで構成することもできます。比較的簡単です。ここには例示的なコードが書かれています。

splash = (RelativeLayout)findViewById(R.id.splash); 
//     
RotateAnimation rotateAnimation = new RotateAnimation(0,360, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
rotateAnimation.setDuration(2000); 
rotateAnimation.setFillAfter(true); 
//     
ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1, 
        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
scaleAnimation.setDuration(2000); 
scaleAnimation.setFillAfter(true); 
//     
AlphaAnimation alphaAnimation = new AlphaAnimation(0.2f,1.0f); 
alphaAnimation.setDuration(2000); 
alphaAnimation.setFillAfter(true); 
//     
TranslateAnimation translateAnimation = newTranslateAnimation (0,0,100,100); 
translateAnimation.setDuration(2000); 
translateAnimation.setFillAfter(true); 
//     
AnimationSet animationSet = new AnimationSet(true); 
animationSet.addAnimation(rotateAnimation); 
animationSet.addAnimation(scaleAnimation); 
animationSet.addAnimation(alphaAnimation); 
animationSet.addAnimation(translateAnimation); 
//     
plash.startAnimation(animationSet); 

1.2   Viewアニメーションをカスタマイズ
カスタムアニメーションは実際にはあまり使われていませんので、簡単に紹介します。
カスタムアニメーションを完成するには、Animationクラスを継承し、そのinitialize()とappyTrans formation()を書き換える必要があります。
前者はいくつかの初期化動作に用いられ、後者は行列変換を行うために用いられる。
1.3     View Groupのすべてのサブ要素にアニメーションを設定します。
上の1.1、1.2はすべてViewにアニメーション効果を設定するので、Androidも同様にView Groupの設定を提供しました。
android:layout Animation=@@anim/layout_アニメをView Groupのすべてのサブ要素に設定する目的を達成します。関連コードを以下に示します。

//res/anim/anim/layout_anim.xml 
<layoutAnimation xmlns:android=” http://schemas.android.com/apk/res/android” 
android:delay=”0.1” //       0.1*T,   100ms 
android:animationOrder=”normal” //             ,  reverse  random 
android: animation=” @anim/layout_anim_item”/> 
 
//res/anim/anim/layout_anim_item.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:duration=”200” //          T 
 animation:interpolator=”@android:anim/accelerate_ interpolator” //      
animation:shareInterpolator=”true”> //              
<alpha android:fromAlpha=”0.2” android: toAlpha =”1.0”/> 
<translate android:fromXDelta=”100” android: toXDelta =”0”/> 
</set> 
1.4     Activityの切り替え設定アニメーション
皆さんも使ったことがあると思いますが、startActivity()の後に使って、Activityを切り替えた時には、一つのシフトのアニメーション効果があります。
overridePendingTransition(R.anim.tran_in,R.anim.tran_out) 

//res/anim/tran_in 
<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="500" 
//     100%     ,  tran_out   toXDelta="-100%p",     
android:fromXDelta="100%p" 
android:fromYDelta="0" 
  android:toXDelta="0" 
  android:toYDelta="0" > 
</translate> 

2.   フレームアニメーション
上記も言及したように、フレームアニメーションは絶え間なく画像を切り替えてアニメーション効果を実現します。明らかにOOMが容易であるため、フレームアニメーションを使用するには、ピクチャサイズに注意が必要である。
フレームアニメーションの使用も簡単で、使用例は以下の通りである。

//res/drawable/myanimation.xml 
<?xml version=”1.0” encoding=”utf-8”?> 
<animation-list xmlns:android=”http://schemas.android.com/apk/res/android” 
 animation:oneshot=”false” > //false     ,true    View   setFillAfter   
<item android: drawable =”@ drawable/ drawable 1” android:duration=” 200”> 
<item android: drawable =”@ drawable/ drawable 2” android:duration=” 200”> 
</animation-list> 
 
//                
view.setBackgroundResource(R.drawable.myanimation.xml); 
(AnimationDrawable)view.getBackground.start(); 
3.   属性アニメーション
Viewアニメーションの4つの効果は明らかな欠点があります。制作した効果は実際にはViewの属性を本当に変えていません。つまり、left、top、right、bottomの値はシステムが一時的に描いたものです。このようにViewのクリック位置は変わっていません。この問題に対して、Android 3.0から属性アニメーションが生まれました。
属性アニメーションの本質は、追加された属性(例えば、トランジストX/Y、スケーリングscaleX/Y、ローテートX/Yなど)を変えて画面を更新することによって、動画効果を実現し、クリック位置のリアルタイム変化を実現する。ただし、属性アニメーションは元の上下左右の4つの値を変更しません。最後に注意したいのは、属性動画はViewだけでなく、どのオブジェクトにも使えます。
属性アニメーションに関するカテゴリと方法を紹介します。
3.1  set Translation X方法
この方法は直接にview属性を変更する方法です。アニメーション効果を使う必要がない場合があります。

view.setTranslationX(x);//3.0   
ViewHelper.setTranslationX(view,x);//3.0    NineOldAndroid    
3.2   Valueアニメイト類

ValueAnimator          ,             ,           ,  onAnimationUpdate()           。
[java] view plain copy  CODE              
ValueAnimator animator = ValueAnimator.ofInt(1, 100); //    ,   1   100   
animator.addUpdateListener(new AnimatorUpdateListener() { 
  @Override 
  public void onAnimationUpdate(ValueAnimator animation){ 
    float fraction = animation.getAnimatedFraction();//     0-1 
    //           start+(end-strat)*fraction,          
    view.getLayoutParams().width = new IntEvaluator().evaluate(fraction,start,end) //   set   
    view.requestLayout(); 
  } 
}); 
animator.setDuration(1000).start(); 

3.3    Objectアニメイト類
Object AnimerはValue Animatorから引き継ぎ、そのままviewの属性を変えることができます。以下の例を紹介します。

//x         
ObjectAnimator animator = ObjectAnimator.ofFloat(view,”scaleX”,2.0f); 
animator.setDuration(1000); 
animator.setStartDelay(1000); 
animator.start(); 
ほとんどの場合はObject Animtorを使えば十分です。Value Animtorのように自分でアニメーション更新のロジックを書かなくてもいいですが、Object Animtorには一定の制限があります。目標属性は指定された処理方法(例えばget/set方法を提供する)を提供する必要があります。そして、我々が初期値を渡さない場合、システムは直接にget法を呼び出して値を取得する。上記3.2で紹介したValue Animerは属性値を直接操作しないので、オブジェクトを操作する属性はse/get方法を必要とせずに、現在のアニメーションの計算で任意の属性を変更することができます。
この問題に対して、政府は一つの種類を使ってオリジナルのオブジェクトを包装することを勧めています。間接的にそのためにget/set方法を提供します。実現するのはとても簡単です。実例は以下の通りです。

ViewWrapper wrapper = new ViewWrapper(view); 
ObjectAnimator.ofInt(view,”width”,200).setDuration(1000).start(); 
 private static class ViewWrapper{ 
  private View myView; 
 public ViewWrapper(View view){ 
  myView = view; 
 } 
 public int getWidth(){ 
  return myView.getLayoutParams().width; 
 } 
 public int setWidth(int width){ 
 myView.getLayoutParams().width = width; 
 myView.requestLayout(); 
 } 
} 

3.4  View PropertyAnimation類
View PropertyAnimationはNineOld Androidライブラリのクラスであり、Object Animtor類の操作を簡略化し、NineOld Androidライブラリは3.0以前のAndroidバージョンに対応しています。次は一例を通して紹介します。

//x        ,   3.3 
ViewPropertyAnimation.animate(view).scaleX(2.0f).setDuration(1000) 
.setInterpolator(new OvershootInterpolator()) 
.setStartDelay(1000).start(); 
3.5  Animation Set類
アニメーションセットは、複数のアニメーションを一つのグループに組み合わせる仕組みを提供し、時間再生、順番再生、または遅延再生のようなアニメーションのタイミング関係を設定することができます。具体的な使い方は簡単で、以下の通りです。

ObjectAnimator objectAnimator1= ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0f);  
ObjectAnimator objectAnimator2= ObjectAnimator.ofFloat(view, "translationY", 0f, 30f);  
ObjectAnimator objectAnimator3= ObjectAnimator.ofFloat(view, "translationX", 0f, 30f);  
AnimatorSet animatorSet = new AnimatorSet();  
animatorSet.setDuration(5000);  
animatorSet.setInterpolator(new LinearInterpolator());   
// animatorSet.playTogether(objectAnimator1, objectAnimator2. objectAnimator3); //          
// 12    ,3      
animatorSet.play(objectAnimator1).with(objectAnimator2);  
animatorSet.play(objectAnimator3).after(objectAnimator2);  
animatorSet.start(); 
4.  補間器のまとめ
4.1  システムは私たちの補間器に提供されました。
様々な補間器はInterpolatorインターフェースを実現しています。システムは直接使用する補間器に提供されています。

 4.2  カスタム補間器
InterpolatorインターフェースはすべてInterpolatorインターフェースを実現し、InterpolatorインターフェースはまたTimeInterpolatorから継承され、TimeInterpolatorインターフェースはシステムによって呼び出されたgetInterpolation方法を定義しています。ここでパラメータinputはアニメーションの進捗度を表し、0と1の間にあります。私達のカスタム補間器は、Interpolatorインターフェースを実現し、get Interpolationを上書きするだけで、カスタムアニメーション効果を実現できます。 
次のようにアニメーションの始終速度が遅く、中間加速のAccellerate Decellerate Interpolator補間器です。

public class AccelerateDecelerateInterpolator extends BaseInterpolator 
    implements NativeInterpolatorFactory { 
  ...... 
  public float getInterpolation(float input) { 
    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; 
  } 
  ...... 
} 

5.  アニメーションモニター
私たちは普段の開発の過程で、アニメーションの完成のタイミングを監督して業務ロジックを継続します。アニメーションの集合にAnimation Listenerモニターを設置することによって実現できます。アニメーションの開始、終了、キャンセル、繰り返し再生はそれぞれモニターできます。

//       
animationSet.setAnimationListener(new Animation.AnimationListener() { 
  @Override 
  public void onAnimationStart(Animation animation) {} 
  @Override 
  public void onAnimationEnd(Animation animation) {} 
  @Override 
public void onAnimationRepeat(Animation animation) {} 
@Override 
  public void onAnimationCancel(Animation animation) {} 
}); 
最後に、アニメーションの各フレームのリピートを監聴したいなら、アニメイトコンピューターListenerモニターを設置して、アニメイトUpdateを書き換えてもいいです。
これでAndroidアニメについての知識をまとめました。
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。