酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Androidでフェードイン/フェードアウト アニメーションを実装する

Androidで時間経過とともにアルファ値を変化させることで、フェードイン・フェードアウトの実装をおこないたかった。Android 3.0から追加されたらしいObjectAnimatorを使うことで、アルファ値を変化させることが可能なようです。

以下のコードでは、getHogeViewメソッドで取得したViewを一旦透明(アルファ値:0.0)に設定した上で、アルファ値:0.0fから1,000ミリ秒掛けてアルファ値:1.0fへ変化させます。

View view = getHogeView(); // フェードイン・アウトさせたいViewを取得
view.setAlpha(0.0f);

ObjectAnimator animation = ObjectAnimator.ofFloat(view, "alpha", 1.0f);
animation.setStartDelay(1000);
animation.start();

アニメーションを多用するアプリケーションを開発しているので、都度上記のコードを書くと大変読みにくくなってしまいます。簡単に呼び出しできるように便利クラス化してしまいました。

package jp.softbuild;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.Animator.AnimatorListener;
import android.view.View;

public class UIAnimation {
	
	/****************************************************
    * 指定したビューのアルファ値をアニメーションさせながら変化させる
    *
    * @param view Viewオブジェクト
    * @param toAlpha 変化させるアルファ値(0.0~1.0)
    * @param duration アニメーション時間(単位:ミリ秒)
    ****************************************************/
	public static void startAlpha(View view, float toAlpha, long duration) {
		UIAnimation.startAlpha(view, toAlpha, duration, 0, null);
	}

	/****************************************************
    * 指定したビューのアルファ値をアニメーションさせながら変化させる
    *
    * @param view Viewオブジェクト
    * @param toAlpha 変化させるアルファ値(0.0~1.0)
    * @param duration アニメーション時間(単位:ミリ秒)
    * @param startDelay アニメーションの開始待ち(単位:ミリ秒)
    ****************************************************/
	public static void startAlpha(View view, float toAlpha, 
            long duration, long startDelay) {
		UIAnimation.startAlpha(view, toAlpha, duration, startDelay, null);
	}

	/****************************************************
    * 指定したビューのアルファ値をアニメーションさせながら変化させる
    *
    * @param view Viewオブジェクト
    * @param toAlpha 変化させるアルファ値(0.0~1.0)
    * @param duration アニメーション時間(単位:ミリ秒)
    * @param startDelay アニメーションの開始待ち(単位:ミリ秒)
    * @param listener アニメーションリスナー
    ****************************************************/
	public static void startAlpha(View view, float toAlpha, 
			long duration, long startDelay, AnimatorListener listener) {
		ObjectAnimator animation 
            = ObjectAnimator.ofFloat(view, "alpha", toAlpha);
		animation.setStartDelay(startDelay);
		animation.setDuration(duration);
		animation.addListener(listener);
		animation.start();
	}
}

例えば、アルファ値:1.0f(不透明)のボタンを、1500ミリ秒待機した後に100ミリ秒かけて透明にするコードは以下の通りです。随分とさっぱりした印象になるのではないかと思います。

UIAnimation.startAlpha(this.button, 0.0f, 100, 1500);

本当はViewクラスの(C#でいうところの)拡張メソッドとして実装したかったのですが、どうもAndroid-Javaにはその手の仕組みがないようなので、上記のような実装となりました。