Draw方法在Android surfaceView中崩溃

时间:2013-06-02 16:32:22

标签: android android-canvas surfaceview

我有一个简单的surfaceView和一个如下的线程。

我正在尝试开始简单,只需将surfaceView的背景绘制成某种颜色。

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

}

但这条线让我的应用程序在运行时崩溃:

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

我在构造函数中定义了backgroundPaint,并在onSizeChanged中设置了它的颜色。还有其他事需要做吗?

1 个答案:

答案 0 :(得分:0)

我想知道就在那条线上方你锁定你的画布但从来没有把它解开来画它...不确定是不是这只是我注意到的东西。因此,请尝试在该行之后解锁。