2012-07-23 68 views
0

我在自定義佈局中面臨一個問題,這是LinearLayout的擴展。我想要實現的是在佈局的畫布上繪製一些形狀。dispatchDraw中的自定義佈局的畫布大小

所以我做了這樣的事情:

public class MyLayout extends LinearLayout { 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 

     int width = canvas.getWidth(); 
     int height = canvas.getHeight(); 

     Log.d(TAG, "canvas width: " + width); 
     Log.d(TAG, "canvas height: " + height); 

     // do some drawing on the canvas ... 
    } 
} 

我離開了,我做實際的繪圖,因爲它並沒有與我的問題做任何事,我猜一部分。

我的問題是,在前ICS(或可能是蜂窩前),畫布似乎是整個屏幕的大小,而不是佈局應繪製的部分。所以我的圖畫最終在錯誤的地方。

例如,在一個HTC渴望從上方輸出的日誌是:

canvas.width: 480 
canvas.height: 800 

鑑於高度應小,因爲有上面和下面的佈局的其他元件。

這個問題在ICS上不存在,我得到一個與我的佈局完全相同的畫布。

+0

其實它似乎有點複雜。在初始dispatchDraw()調用我得到正確的帆布尺寸: 帆布寬度:480個 \t \t帆布高度:690 但立即有如下具有畫布設置爲480×800的第二dispatchDraw()調用。 – neptoon 2012-07-23 11:35:53

+0

好吧,690似乎是沒有狀態欄的完整顯示大小。所以它仍然不是佈局的正確高度。 – neptoon 2012-07-23 11:55:17

+0

好吧,我剛剛發現我應該使用getMeasuredWidth()和getMeasuredHeight(),它似乎可以在所有平臺版本上工作。 – neptoon 2012-07-23 14:01:26

回答

0

您是否需要使用調度繪製?爲什麼不使用invalidate並讓框架計算出畫布的大小。

+0

我不確定我明白你的意思。據我瞭解,dispatchDraw在ViewGroups中用於在子視圖繪製之前進行工作。並且如文檔所述(canvas =>畫布上繪製視圖) 我期望獲得佈局繪製的畫布。 – neptoon 2012-07-23 13:06:25