2012-04-13 59 views
6

我有一個繪圖庫,並與它我有一個自定義的視圖。當需要完成任何更新時,庫調用視圖的invalidate()方法。然後調用onDraw()方法,並且一切正常。View.invalidate()似乎沒有調用View.onDraw()

但是,當我將usesSdkVersion="14"的屬性添加到我的AndroidManifest.xml file時,此功能停止工作。不再是我的觀點的onDraw()方法被調用了。

更多信息: 看來,當我通過我的應用程序中按鈕按鈕的結果呼叫invalidate()時,View按預期更新。此外,我的圖書館內有一個動畫正在正常工作。所以顯然有時它工作正常。但大多數情況下,它不會重新繪製。是否有任何狀態,自定義視圖可以在這將導致操作系統跳過invalidate()被調用後重畫它?

+0

你還在從UI線程調用它嗎?否則你必須使用postInvalidate()。 – Heinrisch 2012-04-13 21:56:41

+0

我試圖更改invalidate postInvalidate只是爲了檢查,並且問題依然存在。 – Rickster 2012-04-13 22:19:11

+0

開啓或關閉硬件加速功能? – 2012-04-13 22:46:55

回答

5

從android 3.0開始,當使用硬件加速時,視圖的繪圖被記錄並存儲在GPU中。

所以當你有兩個視圖:A以上B,你打電話B.invalidate,B.onDraw將被調用並記錄到GPU,但A.onDraw將不會被調用,因爲它已被記錄!

這與調用所有視圖onDraw時的非硬件加速模式不同。

2

官方文件:

但是,因爲不支持所有的2D繪圖操作的硬件加速,將其打開,可能會影響一些使用自定義視圖或繪圖調用您的應用程序。問題通常表現爲不可見的元素,例外或錯誤渲染的像素。

爲了解決這個問題,Android爲您啓用或以下級別禁用硬件加速選項:

應用

<application android:hardwareAccelerated="true" ...> 

活動

窗口

getWindow()setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

查看

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);

我測試在我看來。

1

這似乎是Android中的一個錯誤。取而代之的無效()嘗試使用相同的名稱的方法有四個參數:

view.invalidate(0,0,view.getWidth(), view.getHeight()); 

順便說一句,這是更好的做法是隻無效該地區,這是不斷變化的。通過無效區域的左側,頂部,右側,底部座標。