Handlerでループループ

やはりループは必須である。ということでループの仕方。
普通の携帯アプリとかならwhile()ループを使って実現すると思う。
けどAndroidのサンプルを見てるとHandlerを使うのが普通みたい。
今回のはサンプルにあるSnakeと同様にHandlerを拡張して使っている。


ソースは"Invalidateで描画"の時のやつを1秒ごとにプロットするようにしたもの。
あんまりループの意味無いかも。あるかも。


全てのサンプルを見たというわけではないので違う方法があるのかもしれない。

package net.swelt.android.looptest;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.content.Context;
import android.view.View;
import android.graphics.*;

public class LoopTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new SampleView(this));
    }
    
    private static class SampleView extends View {
    	private int mDrawDelay = 1000;
    	private Paint mPaint = new Paint();
    	private float[] mPts = new float[1000];
    	private int mPtCnt = 0;
    	
    	private RefreshHandler mRedrawHandler = new RefreshHandler();
    	
    	class RefreshHandler extends Handler {
    		@Override public void handleMessage(Message msg) {
    			SampleView.this.update();
    			SampleView.this.invalidate();
    		}
    		
    		public void sleep(long delayMills) {
    			this.removeMessages(0);
    			sendMessageDelayed(obtainMessage(0), delayMills);
    		}
    	}
    	
    	public SampleView(Context context) {
    		super(context);
    		setFocusable(true);
    		
    		Random rand = new Random();
    		final int N = mPts.length >> 1;
    		for( int i = 0; i < N; ++ i ) {
    			mPts[(i << 1) + 0] = rand.nextFloat() * 320;
    			mPts[(i << 1) + 1] = rand.nextFloat() * 200;
    		}
    		
    		update();
    	}
    	
    	private void update() {
    		
    		if( mPtCnt < mPts.length >> 1 ) mPtCnt ++;
    		
    		mRedrawHandler.sleep(mDrawDelay);
    	}
    	
    	@Override protected void onDraw(Canvas canvas) {
    		Paint paint = mPaint;
    		
    		canvas.drawColor(Color.WHITE);
    		
    		paint.setColor(Color.BLUE);
			paint.setStrokeCap(Paint.Cap.SQUARE);
			paint.setStrokeWidth(10);
    		for( int i = 0; i < mPtCnt; ++ i ) {
    			canvas.drawPoint(mPts[(i << 1) + 0],
    					mPts[(i << 1) + 1],
    					paint);
    		}
    	}
    }
}