簡體   English   中英

lockCanvas()返回不同的畫布

[英]lockCanvas() returns different canvases

嘗試在單個畫布上繪制每個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

如果您想保留以前的繪圖,則應在離屏畫布中繪制它們並將它們繪制到從鎖定畫布獲得的畫布上。

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. 我建議不要在Runnable實現中命名一個布爾字段“run”(其中方法返回void)。 即使問題沒有從沖突中浮現出來,也是令人困惑的。 也許“正在運行”或某些東西(任何東西)會更有意義 - 更容易調試。

  2. 在多線程時不要使用Object.wait。 它並不總是(通常,不會)按照您的預期行事。

  3. 你最有可能得到你的Canvas成員的多個實例,因為在某個地方(可能在Android框架中,或者在你的代碼中......很難說),“新的Canvas(args)”被調用,而你認為​​是你的只有Canvas實例在另一個線程上。 雖然只有一個引用,但可以創建多個實例。

  4. 我不建議使用synchronized(無論如何),除非您確定需要這樣做。

  5. 在那里掛。 這個問題非常令人困惑 - 我在去年春天完成了它並不容易或有趣。

希望以上任何一種方式都有所幫助。

布蘭登

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM