package com.android_mvc.sample_project.activities.func_visual; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import com.android_mvc.framework.activities.base.BaseNormalActivity; import com.android_mvc.framework.ui.UIBuilder; import com.android_mvc.framework.ui.UIUtil; import com.android_mvc.framework.ui.anim.AnimationsFinishListener; import com.android_mvc.framework.ui.anim.SequentialAnimationsRunner; import com.android_mvc.framework.ui.anim.desc.AnimationDescription; import com.android_mvc.framework.ui.anim.desc.ArcAnimationDescription; import com.android_mvc.framework.ui.anim.desc.FadeInAnimationDescription; import com.android_mvc.framework.ui.anim.desc.FadeOutAnimationDescription; import com.android_mvc.framework.ui.anim.desc.TranslateAnimationDescription; import com.android_mvc.framework.ui.view.MImageView; import com.android_mvc.framework.ui.view.MRelativeLayout; import com.android_mvc.framework.ui.view.MTextView; /** * サンプルのアニメーション表示アクティビティ。 * 複数のViewの動きを,時間的に連続して,シンプルな記述で制御できる。というのがアピールポイント。 * 試用段階。 * @author id:language_and_engineering * */ public class SampleAnimationActivity extends BaseNormalActivity { MTextView tv1; MImageView iv1; MImageView iv2; MRelativeLayout rl1; MRelativeLayout rl2; MRelativeLayout rl3; SequentialAnimationsRunner anim_runner; @Override public void defineContentView() { // UIを定義 new UIBuilder(context) .add( tv1 = new MTextView(context) .text("↓押すと動き出します。" ) .widthFillParent() .heightWrapContent() , rl1 = new MRelativeLayout(context) .widthFillParent() .heightPx(500) .add( rl2 = new MRelativeLayout(context) .widthFillParent() .heightPx(500) .add( iv1 = new MImageView(context, android.R.drawable.sym_def_app_icon) .click(new OnClickListener(){ @Override public void onClick(View v) { // アニメ開始 startSampleAnimation(); } }) ) , rl3 = new MRelativeLayout(context) .widthFillParent() .heightPx(500) .add( iv2 = new MImageView(context, android.R.drawable.sym_def_app_icon) .invisible() ) ) ) .display(); // アニメーションを定義 anim_runner = new SequentialAnimationsRunner(this) .title("ドロイド君のアイコンの移動") .rootLayoutIs( rl1 ) .add( new AnimationDescription(){ @Override protected void beforeAnimate() { // クリック不可に iv1.unclickable(); } } , // 1個目のアイコンを動かす new AnimationDescription().targetViews( iv1 ) , // 右へ new TranslateAnimationDescription( Animation.ABSOLUTE, 0, 200, 0, 0 ) .velocityLinear().waitBefore(500).duration( 1000 ).waitAfter( 0 ) , // 消える new FadeOutAnimationDescription() .afterVisibility(View.GONE).duration( 1000 ).waitAfter( 100 ) , // 現れる new FadeInAnimationDescription() .duration( 1000 ).waitAfter( 100 ) , // 下へ new TranslateAnimationDescription( Animation.ABSOLUTE, 0, 0, 0, 200 ) .velocityLinear().duration( 1000 ).waitAfter( 500 ) .dontModify() , // 2個目のアイコンに制御対象を切り替える new AnimationDescription().targetViews( iv2 ) , // 左回り new ArcAnimationDescription( 180, 180, 100 ){ @Override protected void beforeAnimate() { iv2.visible(); } } .deltaDegree(30).duration( 2000 ).waitAfter( 500 ) .dontModify() /* , // TODO: この部分は一応動くのだが,場合によって画面がちらついたりする。 http://d.hatena.ne.jp/language_and_engineering/20120416/AndroidAnimationSetSequentialDSL http://d.hatena.ne.jp/language_and_engineering/20120626/AndroidManipulateBitmapPixels // 両方のアイコンを対象とする new AnimationDescription().targetViews( iv1, iv2 ) , // 消える new FadeOutAnimationDescription() .afterVisibility(View.GONE).duration( 2000 ) */ ) .onFinish( new AnimationsFinishListener(){ @Override protected void exec() { // 終了処理 UIUtil.longToast(context, "アニメーションが終了しました。"); } }) ; } /** * サンプルのアニメーションを開始する。 */ protected void startSampleAnimation() { anim_runner.start(); } }