2017-08-11 68 views
0

我正在實施必須從磁盤加載Bitmap的自定義ImageViewBitmap應該完全按比例縮放,其寬度必須等於父級佈局已分配給我的ImageView的最終寬度,並且計算高度以保持寬高比。處理依賴於「視圖」的維度的大量操作

所以,問題是什麼是View生命週期中適當的地方放置取決於View的尺寸在完成佈局後的大規模操作?

(我想保持它的簡單,並沒有使用線程,但是。)

  1. 最有可能這是一個壞主意,把這些代碼在onDraw()方法, 因爲它應儘可能高效可能。另一方面,我的 ImageView不太可能調整大小,所以它只會殺死 的第一個onDraw()的性能,並且不會影響任何後續的 調用onDraw()。所以我不確定這個選項。
  2. 我可以把它放在onLayout(boolean changed, int l, int t, int r, int b)的末尾執行我的 重碼if (changed == true)。這是一個好主意嗎?
  3. 我看到的第三個選項是在onSizeChanged()回調中執行。 我唯一關心的是這個回調是否爲保證爲 每個實際視圖的尺寸變化只調用一次。我傾向於使用 這個選項,因爲在我的測試中它工作正常。

有人可以對此有所瞭解嗎?

回答

0

選項2和3都適用於您獲取視圖的正確尺寸。

onDraw()僅在onLayout()之後被調用。您可以在onLayout()本身中獲得尺寸,最好避免在onDraw()內進行不必要的工作。所以我會選擇選項2或選項3.

並且請注意onSizeChanged()有時被稱爲零。伊恩in this thread

要明確的是onSizeChanged()有時被稱爲帶參數的零 - 檢查這種情況,並立即返回(這樣你就不會 零計算你的佈局時得到一個鴻溝等)。一段時間後 它將被稱爲真實值。

另一種選擇是一個可運行添加到視圖的隊列,使用View.post()

報價和例子from this thread

的UI事件隊列會按順序處理事件。 的setContentView()被調用後,事件隊列將包含要求重新佈局的消息 ,所以任何你郵寄到隊列將佈局後發生 通過

final View view=//smth; 
... 
view.post(new Runnable() { 
      @Override 
      public void run() { 
       view.getHeight(); //height is ready 
      } 
     }); 

使用這種方法,我們可以確保我們的代碼只執行一次。

+0

請記住,我需要讓它在每次執行''View'時不會執行一次,但是一旦執行實際大小change_,所以製作一個'view.post()'似乎就不在這裏。 –

+0

哦。然後使用'onSizeChanged()'方法將是一個更好的選擇。 – Bob

+0

好的,從你提供的鏈接可以推斷出'onSizeChanged()'不能保證只在每個實際'View'的大小改變時被調用一次。那麼如何處理呢?在這種情況下,比較舊的和新的w \ h濾除多個相同大小的呼叫是否正確? –