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(); } } } }