gpt4 book ai didi

java - lockCanvas() 返回不同的 Canvas

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:55 35 4
gpt4 key购买 nike

尝试在单个 Canvas 上每毫秒绘制一些东西。我的意思是只向 Canvas 添加细节,而不是每一帧都重新绘制。所以这段代码给了我三个不同的 Canvas 。第三,然后又是第一。为什么?

public void run() {
this.run = true;
Canvas canvas = null;
while (run) {
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (this.surfaceHolder) {
Thread.sleep(delay);
draw(new Img(canvas, size));
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (canvas != null) {
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}
synchronized (this) {
if (wait) {
try {
wait();
} catch (Exception e) {}
}
}
}
}

如果它是安卓三重缓冲——如何关闭它,或者用它做些什么?安卓4.2.1

最佳答案

如果您想保留之前的绘制,您应该在离屏 Canvas 中绘制它们,然后将它们绘制到您从锁定 Canvas 获得的 Canvas 上。

说明这个想法的 puesd 代码:

Bitmap offScreenBitmap = Bitmap.createBitmap(100,200,Bitmap.ARGB_8888);
Canvas offScreenCanvas = new Canvas(offScreenBitmap);

onScreenCanvas = this.surfaceHolder.lockCanvas();

//always draw to te offScreenCanvas
offScreenCanvas.drawXxxx

//copy the data to on-screen canvas you got from the lock
onScreenCanvas.drawBitmap(offScreenBitmap);

unlockAndPost(onScreenCanvas)

这应该可以完成您的任务。对吧?

然后,一些幕后的东西:

是的,android view(surface IS A view)有多个缓冲区:一个被应用程序用来绘制,一个被系统用来渲染,有时当应用程序不能及时完成绘制时还有第三个缓冲区。没有办法将其关闭,您也不会想要。正如您已经观察到的那样,这就是您在锁定时获得不同 Canvas 的原因。

关于java - lockCanvas() 返回不同的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14377983/

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