Canvas对象必须与lockCanvas先前返回的实例相同

WD4*_*D40 3 java android surfaceview android-canvas

我有一个自定义SurfaceView,其方法是doDraw()绘制背景和位图.问题是当我运行这个时我得到一个错误

引起:java.lang.IllegalArgumentException:canvas对象必须与lockCanvas先前返回的实例相同

我不明白为什么会这样.我没有在我的代码中的任何其他地方声明任何其他画布.我只有另外两个类,MainActivity和SurfaceViewExample.MainActivity只是打算打开SurfaceViewExample,而SurfaceViewExample只有一些按钮调用的方法.

OurView类:

package com.thatoneprogrammerkid.gameminimum;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class OurView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;
    private Bitmap testimg;
    public int xCoord = 500;
    public int yCoord = 500;

    public OurView(Context context) {
        super(context);
        init();
    }

    public OurView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public OurView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        holder = getHolder();
        holder.addCallback(this);
        testimg = BitmapFactory.decodeResource(getResources(),R.drawable.testimg);
    }

    void moveImage(int xChange, int yChange) {
        xCoord += xChange;
        yCoord += yChange;
        doDraw();
    }

    void doDraw() {
        Canvas myCanvas = holder.lockCanvas();
        if (myCanvas != null) {
            myCanvas.drawARGB(255, 55, 255, 255);
            myCanvas.drawBitmap(testimg, xCoord, yCoord, null);
        }
        holder.unlockCanvasAndPost(myCanvas);
    }

    @Override
    public void surfaceCreated(final SurfaceHolder holder) {
        doDraw();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}

}
Run Code Online (Sandbox Code Playgroud)

fad*_*den 7

移动语句unlockCanvasAndPost()内部if (myCanvas != null) {.我的猜测是lockCanvas()返回null,并且您正在尝试解锁空引用.

查看源代码,"它是否相同"的测试出现在"它是否完全锁定"的测试之前 - 并且mCanvas被初始化为非空值.