2012-03-14 105 views
1

今天我收到了一份崩潰報告,因爲在以下片段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的問題是爲什麼他們是零樹已經奠定了後。每一個繪圖代碼片段都需要寬度和高度等原始信息,所以我很愚蠢的是每次覆蓋onDrawdispatchDraw時我必須檢查它們是否爲非零。這應該由系統進行處理,大部分的時間,它是因爲我從來沒有能夠重現這個bug,只獲得兩個碰撞報告

回答

0

顯然,他們可以。對寬度或高度等於零沒有安全警戒。所以,當使用它們來計算繪製座標時,必須注意並檢查有效的尺寸。

實際上,因爲有寬度/高度等於零的景觀,真可謂無房可顯示任何東西,我用這個簡單的代碼跳過繪圖程序

@Override 
public void onDraw(Canvas canvas) 
    if (getWidth() == 0 || getHeight() == 0) 
    return; 
    // rest of the code... 
0

的方法Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)拋出IllegalArgumentException如果寬度或高度是< = 0
這裏閱讀:http://developer.android.com/reference/android/graphics/Bitmap.html#createBitmap%28int,%20int,%20android.graphics.Bitmap.Config%29
你必須使用一個try{}catch(){}聲明

+0

是的,這是顯而易見的。我問**爲什麼**例程調用中的寬度和高度爲零 – Raffaele 2012-03-14 11:55:10

+0

這是按合同規則設計的。如果你重寫onDraw()和dispatchDraw(),你必須完成他們設計的所有工作。 – rosco 2012-03-14 13:03:24

+0

我無法在任何地方找到此*合約*。該文檔並沒有說明在繪製之前你必須'requestLayout',並且最重要的是檢查兩邊爲零是沒有意義的,因爲系統應該完全跳過繪圖。事實上,這個bug幾乎沒有發生過,我無法重現它。自己嘗試 – Raffaele 2012-03-14 18:39:42