lockCanvas()返回不同的画布

时间:2013-01-17 11:22:37

标签: java android android-canvas

尝试在单个画布上绘制每个ms的内容。我的意思是只向画布添加细节,而不是每一帧都重绘它。所以这段代码给了我三个不同的画布。第三,然后再次。为什么呢?

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

如果是android三重缓冲 - 如何关闭它,或者用它做什么? Android 4.2.1

2 个答案:

答案 0 :(得分:2)

如果您想要保留以前的绘图,则应在离屏画布中绘制它们并将它们绘制到从锁定画布获得的画布上。

用于说明这个想法的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视图(表面是一个视图)有多个缓冲区:一个被应用程序用于绘图,一个被系统用于渲染,有时还有第三个,如果应用程序无法及时完成绘制。无法关闭它,你不会想要。这就是你在锁定时获得不同画布的原因。

答案 1 :(得分:1)

  1. 我建议不要命名一个布尔字段,"运行"在Runnable实现中(方法返回void)。即使问题没有从冲突中浮现出来,也会让人感到困惑。也许"运行"或某些东西(更有意义)会更有意义 - 更容易调试。

  2. 多线程时不要使用Object.wait。它不会总是(通常,不会)按照您的预期行事。

  3. 你最有可能获得Canvas成员的多个实例,因为某处(可能在Android框架中,或者在你的代码中......很难说),"新的Canvas(args)&# 34;正在被调用,而你认为​​你唯一的Canvas实例是在另一个线程上。虽然只有一个引用,但可以创建多个实例。

  4. 我不建议使用synchronized(无论如何),除非您确定需要这样做。

  5. 挂在那儿。这个问题非常令人困惑 - 我在去年春天完成了它并不容易或有趣。

  6. 希望以上任何一种方式都有所帮助。

    布兰登