0

I have a simple surfaceView and a thread as below.

I'm trying to start simple and just paint the background of surfaceView a certain color.

package com.example.surfviewtest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SView extends SurfaceView implements SurfaceHolder.Callback {

    private Paint backgroundPaint;
    private Activity activity;
    private Paint circlePaint;
    private vThread vThread;
    private Canvas canvas;

    public SView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        activity = (Activity) context;

        getHolder().addCallback(this);

        backgroundPaint = new Paint();
        circlePaint = new Paint();

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        backgroundPaint.setColor(Color.YELLOW);
        circlePaint.setStrokeWidth(w / 12);
        circlePaint.setColor(Color.BLUE);

        vThread = new vThread(getHolder());
        vThread.start();

        // Canvas canvas = null;
        // SurfaceHolder surfaceHolder = null;
        // canvas = surfaceHolder.lockCanvas(null);
        // canvas.drawRect(0, 0,canvas.getWidth(),canvas.getHeight(),
        // backgroundPaint);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    public void svDraw(Canvas canvas){
        canvas.drawRect(0, 0,canvas.getWidth(),canvas.getHeight(), backgroundPaint);
    }

    private class vThread extends Thread {
        private SurfaceHolder surfaceHolder;
        private boolean threadRunning = true;

        public vThread(SurfaceHolder holder) {
            surfaceHolder = holder;
            setName("vThread");
        }

        @Override
        public void run() {
            Canvas canvas = null;
            while (threadRunning) {
                try {
                    canvas = surfaceHolder.lockCanvas(null);

                    synchronized (surfaceHolder) {

                         svDraw(canvas);
                    }
                } finally {
                    if (canvas != null)
                        surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

}

But this line makes my app crash whenever I run it:

canvas.drawRect(0, 0, canvas.getWidth(),canvas.getHeight(), backgroundPaint);

I defined backgroundPaint in my constructor and set the color of it in onSizeChanged. Is there something else that needs to be done?

4

1 に答える 1

0

その行のすぐ上でキャンバスをロックしますが、ロックを解除して描画することはありません...それがそれであるかどうかはわかりませんが、私が気づいたことです。その行の直後にロックを解除してみてください。

于 2013-06-07T15:56:55.833 に答える