簡體   English   中英

Android 等待 UI 線程失效

[英]Android wait for UI thread to invalidate

我在繪畫應用程序中重繪視圖時遇到問題。 當觸摸結束時,我調用 touch_up() 來創建路徑,調用 invalidate() 來繪制它,並調用 storeView() 來將當前視圖壓入堆棧。 然而,視圖根本沒有重繪(直到下一次觸摸,給它一個抽搐的效果)。 如果我刪除對 storeView() 的調用,它會立即重繪。

我從這里了解到問題是 invalidate() 不一定會立即發生,我認為我需要創建一個新線程或處理程序來等待它。 盡管閱讀了開發頁面,但我並不完全理解如何實現它。

這真的是我需要做的嗎? 如何讓 storeView() 等到視圖被重繪? 我已經為此奮斗了一段時間,答案會讓我開心。 謝謝!

這是我目前所做的。

行動:

case MotionEvent.ACTION_UP:
    touch_up();
    invalidate();
    storeView();
    break;

潤色:

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

商店視圖:

public void storeView(){
    historyCount++;
    if(historyCount > historySize) historyCount = 6;    //We don't want more than 6
    history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}

當觸摸結束時,我調用 touch_up() 來創建路徑,調用 invalidate() 來繪制它,並調用 storeView() 來將當前視圖壓入堆棧。

為什么storeView()持有整個 bitmap? 為什么不使用可以重放(並且可能反轉)的存儲命令? 您正在以這種方式占用大量 RAM。

我從這里了解到問題是 invalidate() 不一定會立即發生

正確的。

我想我需要創建一個新的線程或處理程序來等待它。

不,如果您要堅持保存整個位圖的實現,則需要確保在invalidate()完成后調用storeView() storeView()的調用包裝在Runnable中並通過調用myViewpost()來安排Runnable就足夠了。

暫無
暫無

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

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