Pages

    2010年8月24日火曜日

    ViewFlipperでテキストアニメーション


    API DEMOSのViews/Animation/Pushにテキストがニュースヘッダーのようにアニメするサンプルがあります。それをいじってボタンを押したら(もしくは何らかのイベントで)アニメが動くようにしてみました。アニメの部分をクラスにしてまとめたので、いじりやすくなったんじゃないかと思ってます。(あくまで自己満足)

    ソースはアニメのクラスとそれを呼び出す部分の2つです。(レイアウト、アニメなどXMLは除く)

    注)以下のコードはLogCatにずっと実行されてるみたいな挙動だったので使わないでね。直したものを最後に張っておきます。

    以下だめだめ
    呼び出し側
    package com.yoropan.TextAnimation;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ViewFlipper;
    
    public class TextAnimation extends Activity {
    
     private ViewFlipper mFlipper;
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      final TextView stats = (TextView) findViewById(R.id.stats);
      final TextView stats2 = (TextView) findViewById(R.id.stats2);
      stats.setText("aaaaaaa");
      stats2.setText("bbbbbbbbbb");
    
      Button btn = (Button) findViewById(R.id.change);
      Button btn2 = (Button) findViewById(R.id.change2);
      
      mFlipper = (ViewFlipper) findViewById(R.id.flipper);
      
      btn.setOnClickListener(new View.OnClickListener() {
    
        DoFlipper d=new DoFlipper(TextAnimation.this);
       public void onClick(View v) {
       d.pushup(mFlipper);//上に動け
       }
    
      });
      btn2.setOnClickListener(new View.OnClickListener() {
       public void onClick(View v) {
         DoFlipper d=new DoFlipper(TextAnimation.this);
        d.pushdown(mFlipper);//下に動け
        
       }
      });
     }
     
     
     
    }
    

    アニメの方のクラス
    package com.yoropan.TextAnimation;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    
    import android.app.Activity;
    import android.view.animation.AnimationUtils;
    import android.widget.ViewFlipper;
    
    public class DoFlipper {
     
     Timer timer = null;
     // ハンドラ
     android.os.Handler handler = new android.os.Handler();
     
     private Activity activity;
     public DoFlipper(Activity activity) {
      this.activity=activity;
      }
     void pushup(ViewFlipper mFlipper) {
      mFlipper.startFlipping();
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_up_in));
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_up_out));
      mFlipper.showNext();
      timestop(mFlipper);//stop
      // mFlipper.setAnimation(AnimationUtils.loadAnimation(TextAnimation.this, R.anim.push_up));
      
     }
      void pushdown(ViewFlipper mFlipper) {
      mFlipper.startFlipping();
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_down_in));
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_down_out));
      mFlipper.showNext();
      timestop(mFlipper);//stop
     }
     private void timestop(final ViewFlipper mFlipper) {
      // タイマの設定
      timer = new Timer(true);
      timer.schedule( new TimerTask() {
    
       public void run() {
    
        // 表示の更新
        handler.post( new Runnable() {
         public void run() {
          mFlipper.stopFlipping();
          //pushdown();
         }
        });
    
       }
    
      }, 1000, 1000 );
     }
    }
    
    

    以下LogCatで確認したOKなやつ
    呼び出し側
    package com.yoropan.TextAnimation;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ViewFlipper;
    
    public class TextAnimation extends Activity {
    
     public static ViewFlipper mFlipper;
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      final TextView stats = (TextView) findViewById(R.id.stats);
      final TextView stats2 = (TextView) findViewById(R.id.stats2);
      stats.setText("aaaaaaa");
      stats2.setText("bbbbbbbbbb");
    
      Button btn = (Button) findViewById(R.id.change);
      Button btn2 = (Button) findViewById(R.id.change2);
      
      mFlipper = (ViewFlipper) findViewById(R.id.flipper);
      
      btn.setOnClickListener(new View.OnClickListener() {
    
        DoFlipper d=new DoFlipper(TextAnimation.this);
       public void onClick(View v) {
       d.pushup();//上に動け
       }
    
      });
      btn2.setOnClickListener(new View.OnClickListener() {
       public void onClick(View v) {
         DoFlipper d=new DoFlipper(TextAnimation.this);
        d.pushdown();//下に動け
        
       }
      });
     }
     
     
     
    }
    

    アニメの方のクラス
    package com.yoropan.TextAnimation;
    
    import android.app.Activity;
    import android.view.animation.AnimationUtils;
    import android.widget.ViewFlipper;
    
    public class DoFlipper {
     ViewFlipper mFlipper=TextAnimation.mFlipper;
     
     private Activity activity;
     public DoFlipper(Activity activity) {
      this.activity=activity;
      }
     void pushup() {
      mFlipper.startFlipping();
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_up_in));
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_up_out));
      mFlipper.showNext();
      mFlipper.stopFlipping();
      
     }
      void pushdown() {
      mFlipper.startFlipping();
      mFlipper.setInAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_down_in));
      mFlipper.setOutAnimation(AnimationUtils.loadAnimation(activity, R.anim.push_down_out));
      mFlipper.showNext();
      mFlipper.stopFlipping();
     }
    
    }
    

    タイマーをかませると見た目はとまってるんだけどログには出続けるのでなんか気持ち悪かった(たぶん電池とか消費するんだろうな)ので直しました。