gpt4 book ai didi

java - Canvas 对象必须与之前由 lockCanvas 返回的实例相同

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:29 27 4
gpt4 key购买 nike

我有一个自定义的 SurfaceView,它带有绘制背景和位图的方法 doDraw()。问题是当我运行它时出现错误

Caused by: java.lang.IllegalArgumentException: canvas object must be the same instance that was previously returned by lockCanvas

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

我们的 View 类:

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

}

最佳答案

unlockCanvasAndPost() 移动到 if (myCanvas != null) { 语句中。我的猜测是 lockCanvas() 返回 null,而您正在尝试解锁 null 引用。

查看the source code ,“是否相同”的测试先于“是否完全锁定”的测试——并且 mCanvas 被初始化为一个非空值。

关于java - Canvas 对象必须与之前由 lockCanvas 返回的实例相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29948673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com