人生ずっと勉強

人生ずっと勉強ですね。 https://twitter.com/KiyotakaGoto

Android でアニメーションを連続して順番に実行する方法

「1秒間でフェードイン、3秒くらいその場で停止し、3秒かけてフェードアウト」といった、特定の動きを連続して実行する仕組みが現在の Android にはないようです。

そこで、 setAnimationListener の onAnimationEnd メソッドを使って、アニメーション終了時に次のアニメーションを実行するようにします。

以下は、ある Fragment にアニメーションを付ける例です。

package com.example.testanimation;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.RelativeLayout;

public class MyFragment extends Fragment {
    public MyFragment() {}
    private TranslateAnimation animation = null;

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View view = inflater.inflate( R.layout.notice_fragment, container, false );
       return view;
    }

    private TranslateAnimation createAnimation () {
        TranslateAnimation fadeInAndOut = new TranslateAnimation(
                0.0f, 0.0f, -100.0f, 0.0f
        );
        
        fadeInAndOut.setDuration(1000);
        fadeInAndOut.setAnimationListener( new AnimationListener() {
            @Override public void onAnimationStart(Animation animation) {}
            @Override public void onAnimationRepeat(Animation animation) {}
            @Override
            public void onAnimationEnd(Animation animation) {
                View view = MyFragment.this.getView();
                
                TranslateAnimation stay = new TranslateAnimation(
                    0.0f, 0.0f, 0.0f, 0.0f
                );
                stay.setDuration( 3000 );
                stay.setAnimationListener( new AnimationListener() {
                    @Override public void onAnimationStart(Animation animation) {}
                    @Override public void onAnimationRepeat(Animation animation) {}
                    @Override public void onAnimationEnd(Animation animation) {
                        View view = MyFragment.this.getView();
                        
                        // third animation
                        TranslateAnimation fadeOut = new TranslateAnimation(
                            0.0f, 0.0f, 0.0f, -100.0f
                        );
                        fadeOut.setDuration( 1000 );
                        fadeOut.setFillAfter( true );
                        view.startAnimation( fadeOut );
                    }
                });
                view.startAnimation( stay );
            }
        });
        
        return fadeInAndOut;
    }

    public void notice () {
        Activity activity = this.getActivity();
        View view = this.getView();

        if ( this.animation == null ) {
            this.animation = this.createAnimation();

            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT
            );
            
            activity.addContentView(view, layoutParams );
        }
        
        view.startAnimation( this.animation );
    }
}

見ての通り、JavaScript とかでよくある入れ子地獄が発生しています。
これをキレイに書く方法ないんですかねー・・・。