Invalidateで描画

毎フレームごと描画処理をしたいときはinvalidate()を使う。
ソースの最後の方のinvalidate()というのがミソ。

ただこれは描画処理のみなので、他の処理をしたいときはHandlerを使うみたいだ。


ソースはサンプルにある"DrawPoints.java"を少し改造したもの。
毎フレーム点が増えていく。


invalidate()を使うと前回描画したものが全て消えるため、
毎回個数分の点を打つことになり非効率的である。どうにかならないものか。

package net.swelt.android.invalidatetest;

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

import java.util.Random;

public class InvalidateTest 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 Paint mPaint = new Paint();
    	private float[] mPts = new float[1000];
    	private int mPtCnt = 1;
    	
    	public SampleView(Context context) {
    		super(context);
    		
    		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() * 240;
    		}
    	}
    	
    	@Override protected void onDraw(Canvas canvas) {
    		Paint paint = mPaint;
    		    		
    		canvas.drawColor(Color.WHITE);
    		
    		for( int i = 0; i < mPtCnt; ++ i ) {
    			paint.setColor(Color.BLUE);
    			paint.setStrokeCap(Paint.Cap.SQUARE);
    			paint.setStrokeWidth(10);
    			canvas.drawPoint(
						mPts[(i << 1) + 0],
    					mPts[(i << 1) + 1],
    					paint);
    		}
    		
    		if( mPtCnt ++ < (mPts.length >> 1) ) {
    			invalidate();
    		}
    	}
    }
}