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にはその手の仕組みがないようなので、上記のような実装となりました。