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 とかでよくある入れ子地獄が発生しています。
これをキレイに書く方法ないんですかねー・・・。