今天我收到了一份崩潰報告,因爲在以下片段w
和/或h
爲零。我重寫dispatchDraw
在我的自定義ViewGroup
繪製覆蓋孩子們繪製後:繪圖程序中的寬度和高度是否爲零?
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
int w = getWidth();
int h = getHeight();
bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
// ...
}
我仔細看了documentation和誠實不明白爲什麼我要與視圖大小麻煩,因爲當系統要求繪圖,所有視圖必須已經佈置(如果大小爲零,繪製視圖是沒有意義的)。此外,這個錯誤很難追查,因爲我無法複製它,並且因爲我在超過20萬次下載中只有2次崩潰報告。什麼是錯,我該如何恢復它?
閱讀本我知道這個問題是widht和高度都爲0的問題是爲什麼他們是零樹已經奠定了後。每一個繪圖代碼片段都需要寬度和高度等原始信息,所以我很愚蠢的是每次覆蓋onDraw
或dispatchDraw
時我必須檢查它們是否爲非零。這應該由系統進行處理,大部分的時間,它是因爲我從來沒有能夠重現這個bug,只獲得兩個碰撞報告
是的,這是顯而易見的。我問**爲什麼**例程調用中的寬度和高度爲零 – Raffaele 2012-03-14 11:55:10
這是按合同規則設計的。如果你重寫onDraw()和dispatchDraw(),你必須完成他們設計的所有工作。 – rosco 2012-03-14 13:03:24
我無法在任何地方找到此*合約*。該文檔並沒有說明在繪製之前你必須'requestLayout',並且最重要的是檢查兩邊爲零是沒有意義的,因爲系統應該完全跳過繪圖。事實上,這個bug幾乎沒有發生過,我無法重現它。自己嘗試 – Raffaele 2012-03-14 18:39:42