Android開発ノート(十五)フェードアウト動画TransitionDrawable


フェードアウトアニメーションといえば、補間アニメーションの中のAlphaAnimationを思い浮かべるかもしれませんが、この深浅アニメーションは透明度にグラデーション効果しかありません.つまり、1つの図形に対して深浅な色変換しかできません.AピクチャからBピクチャに徐々に変化したい場合、つまりフェードアウト(Fade-in and Fade-out)効果を実現するには、AlphaAnimationが十分ではないことは明らかです.
幸いにもAndoidは私たちの急いでいることを急いで、私たちの考えを考えて、Animationはだめで、Drawableが試してみることができます.前のブログはグラフィックの章で、ブロガーは以下のDrawableについて言及しました.
1、StateListDrawable:詳細はAndroid開発ノート(七)初識Drawableを参照
2、ShapeDrawable:詳細はAndroid開発ノート(八)不思議なshapeを参照
3、NinePatchDrawable:詳細はAndroid開発ノート(九)特別の.9画像を参照
実はDrawableは種類が多く、この3つだけではありません.Androidの開発ドキュメントをよく読むと、TransitionDrawableを見つけたかもしれません.TransitionDrawableは、フェードアウトされたアニメーション効果を実現するのに役立ちます.
くだらないことは言わないで、直接コードに行ってTransitionDrawableがどのように働いているかを見てみましょう.次のコードはAlphaAnimationとTransitionDrawableの両方を実現しており、この2つのアニメーション効果を比較するのに便利です.
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener {

	private ImageView iv_alpha;
	private AlphaAnimation alphaAnimation;
	private TransitionDrawable transitionDrawable;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button btn_play1 = (Button) findViewById(R.id.btn_play1);
		Button btn_play2 = (Button) findViewById(R.id.btn_play2);
		btn_play1.setOnClickListener(this);
		btn_play2.setOnClickListener(this);
		iv_alpha = (ImageView) findViewById(R.id.iv_alpha);
		//        ,        ,         
		iv_alpha.setAlpha(0.0f);
		alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
		alphaAnimation.setDuration(3000);    //        
		alphaAnimation.setFillAfter(true);   //            
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.btn_play1) {
			iv_alpha.setImageResource(R.drawable.alpha_begin);
			iv_alpha.setAlpha(1.0f);
			iv_alpha.setAnimation(alphaAnimation);
			alphaAnimation.start();
		} else if (v.getId() == R.id.btn_play2) {
			//             Drawable  ,      
			Drawable[] drawableArray = {
					getResources().getDrawable(R.drawable.alpha_begin),
					getResources().getDrawable(R.drawable.alpha_end)
					};
			transitionDrawable = new TransitionDrawable(drawableArray);
			iv_alpha.setImageDrawable(transitionDrawable);
			transitionDrawable.startTransition(3000);
		}

	}

}

以下はフェードアウトアニメーションの効果図です
ここで使用するフェードアウトアニメーションコードをダウンロードするには