2011-07-13 49 views
0

在我的應用程序中,我有許多代表圖形儀表的視圖。目前,量表直接代表一組輸入數據,在特定量表上調用postInvalidate()查看其觀察數據的變化。Android:許多需要頻繁重繪的視圖。線程方法?

接下來我要介紹的是一個模擬實際量規的減震指針運動,以及其他一些奇特的動畫功能。執行衰減運動等的計算當然是微不足道的。需要一些思考的事實是,在數據模型發生變化後,給定視圖最初被調用invalidate()後,該視圖需要定期「打勾」(即無效)以允許它onDraw()在初始數據更改後執行幾次,以執行潤版指針動畫,直到指針完全停止並且View不再需要刻度。

我可以看到這樣做的主要有兩種方式:

  1. 每個計查看都有自己的主題,以定期調用postInvalidate()。當指針移動序列結束時,該線程最終會自動停止。這樣做的結果是,如果屏幕上顯示一堆量表,所有響應不同的數據輸入,那麼任何時候任何這些視圖都可以運行它自己的運動線程。如果屏幕顯示十個量表,那麼您可以隨時在這些視圖中運行零個到十個單獨的線程。

  2. 第二種方法是從視圖本身完全遠離此'打勾',然後通過單個線程執行所有調用invalidate()。這個單線程可能被放置在Activity中,或者在某個GaugeTick類中定義,或者其他東西。當他們需要在初始數據模型更改之後開始執行一些動畫並且可以在完成時取消自己的註冊時,個人可以通過它向個人註冊。每次'tick'線程喚醒時(例如假設它每100ms進入休眠狀態,例如非常大約10Hz的勾號),它將在其觀察者ArrayList中的所有視圖上運行並調用postInvalidate()

我個人比較喜歡的選項1,因爲,如果我想在MVC模式排序方式,阻尼運動的視圖本身的屬性,它應該是內部的實現細節的機制該視圖。從編程的角度來看,在View中運行單個線程感覺更加優雅。此外,一個視圖的單個線程可以有一個特定的睡眠時間間隔,以適應任何形式或動畫的速度。

另一方面,每個視圖中的單個線程是否會潛在地破壞系統的性能,即使它們都將壽命短暫,並且大部分時間都在睡覺?我是否可能會要求可能運行這麼多線程的問題,這些都需要在活動暫停/銷燬或取向改變時停止?對於選項2來說,在線程禮儀方面感覺不那麼令人頭疼。

感謝,

崔佛

回答

0

我不認爲你需要多線程的。如果我理解正確,您想重新繪製視圖(量表)以響應某些用戶輸入(觸摸事件)。系統UI線程處理繪圖和用戶輸入。只需在測量儀視圖中添加一個invalidate()即可響應用戶輸入(您的情況可能爲onTouchEvent())。消息隊列稍後會收到一條消息以重新繪製標尺。

onTouchEvent()應該處理ACTION_MOVE事件,如果您希望實時響應或ACTION_UP如果您希望它在用戶完成時作出響應。

Barry

+0

非常感謝您的回答,Barry。然而,這個問題不是關於事件的迴應,我已經根據數據模型中的更新通過簡單的觀察者機制改變了視圖。這個問題涉及在數據改變事件之後短時間週期性地使給定視圖或多個視圖無效(')以執行衰減動畫的'最佳'方法。 – Trevor

+0

對不起,我不知道你的動畫是什麼意思。 –