2012-12-08 51 views
2

我希望在視圖完成重新繪製後通知我,讓它失效。如this answer所述,invalidate()方法不立即調用UI的視圖的onDraw(),而是在主線程空閒後執行的消息隊列中調度重繪。Android - 重新繪製失效後的監聽器()

我想展示一個進度對話框,做一些UI修改,然後在正確繪製視圖時關閉對話框。是否有一些技巧可以讓我知道視圖何時被繪製?也許通過繼承視圖,覆蓋onDraw()方法?

回答

4

我想你自己回答了你的問題。爲什麼不:

public class DrawListenerView extends View{ 
    private Callback callback; 
    public DrawListenerView(Callback callback){ 
     this.callback = callback; 
    } 

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

     //add your method here you want to call 
     //Or use a Callback-pattern 
     callback.finish(); 
    } 
} 

public interface Callback(){ 
    public void finish(); 
} 

如果你看看來源:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.invalidate%28%29

註釋上面說

無效整個視圖。如果視圖可見,onDraw(android.graphics.Canvas)將在未來的某個時刻被調用。這必須從UI線程調用。要從非UI線程調用,請調用postInvalidate()。

試試吧:)

編輯:也許你想使用一個回調來處理這個問題。

+0

你能解釋更多嗎?我遇到了類似問題的問題。你能看看我的問題嗎? http://stackoverflow.com/questions/21071689/android-listener-when-the-view-redrawn-finished – lolyoshi

3

你發現嘗試這樣做很奇怪,因爲你正在做的全部錯誤。 ;)

你正在談論的是想等到關閉一個對話框,直到完成繪製。這意味着您有一個足夠長的繪圖操作,您可以等待它。

在onDraw中繪製一幀應該是快。如果您想要達到60fps並且擁有流暢的用戶界面,那麼每幀有16毫秒的時間來完成任何輸入處理和繪圖。繪圖應該永遠不會花費足夠長的時間,以至於在完成時您想要顯示進度對話框。 (除此之外,通過使UI部分失效阻止您的UI線程進行繪製,並且您的進度對話框無法說明任何進度,直到完成任何操作爲止。)

如果您需要執行一些複雜的屏幕外渲染以後再顯示,您應該在AsyncTask或類似的UI線程中執行此操作,而不是在視圖的實際onDraw方法中執行。一旦您完成回調,您可以快速繪製剛創建的預渲染圖像並關閉進度對話框。

+1

問題是,我沒有做圖紙,系統是。我所做的只是要求一些TextViews更改文本大小,這會導致多次失效,然後在父視圖結束後,我想開始遊戲倒計時。我的主要問題是Android爲我的setTextSize做了很多無效的調用,但我在另一個問題上詢問了這個問題。 – Axarydax