2012-02-10 53 views
2

我正在研究針對Android 2.2的自定義補間效果。這不是一個直觀的視圖動畫(很多事情都是基於補間的進展而發生的),所以2.2中的動畫類是不夠的(顯然Animator會這樣做,但不可用)。Android定製補間 - 定時器vs ScheduledThreadPoolExecutor,或替代

我已經實現了基本邏輯(移植我之前寫過的JS和AS補間引擎),它似乎工作正常,但有點慢。例如,在JS或AS中運行25ms的間隔會產生平滑的視覺效果,但在Android實現中看起來「矮胖」 - 將間隔減少到10ms似乎對一些有幫助,但它肯定不如內置光滑動畫。

我正在使用計時器和計時器任務 - 我讀過ScheduledThreadPoolExecutor是「首選」,但從我讀過的優點似乎更多與異常處理和多任務(我只會有一個補間運行)。

計時器特別慢嗎?如果ScheduledThreadPoolExecutor更高效?還有另一個更好的選擇,我不知道?

TYIA

回答

4

對於未來的搜索者,答案是隻使用一個直接的Handler和sendMessage(沒有延遲)。

大量的實驗,包括線程,定時器,執行人等,性能最好,最可預測的結果,而最簡單的代碼後,基本上就是:

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(final Message message) { 
     switch (message.what) { 
      case TWEEN: 
      try { 
       double progress = timeKeeper.getEasedProgress(5); 
       float position = (float) originalValue + ((destinationValue - originalValue) * progress)); 
       setValue(position); 
       if(!timeKeeper.atEnd()){ 
        sendEmptyMessage(TWEEN); 
       } 
      } catch (Exception e) { 
      } 
     }    
    } 
}; 

其中originalValuedestinationValuesetValue只是任意成員來處理補間的三角洲。 timeKeeper是一個非常簡單的類,只是測量經過時間,並返回三角洲(ellapsed /持續時間)。 getEasedProgress僅適用於該增量的一些基本寬鬆插值。

感謝來自谷歌android開發人員郵件列表pskink指出我在正確的方向。

2

主要優點我的ScheduledThreadPoolExecutor看到的是你可以池中的線程數,如果一個線程是有點hungup其他線程可以從定義池中使用。這裏很有趣SO discussion on this topic.

+0

感謝您的評論。你包含的鏈接是一個鏈接到這個頁面,順便說一句。對於這種短時間,高間隔定時操作,你會有什麼建議? – momo 2012-02-10 21:56:23

+0

對不起!我添加了正確的網址。我會去與計時器。 – kosa 2012-02-10 21:57:50

+0

在這個鏈接的好消息 - 我沒有使用守護進程,現在就試試。 +1 – momo 2012-02-10 22:09:56

2

你不需要一個ScheduledThreadPoolExecutor,因爲你不需要一個ThreadPool,你只需要一個線程來管理你的動畫。放緩可能在您的動畫引擎的實施中。我不確定Timer是多麼有效。

+0

感謝您的評論。動畫引擎是直接的數學運算,並且應該是非常快的(對數學的反應的代碼 - 不是引擎本身的一部分,而是聽衆 - 可能不是)。對於這種短時間,高間隔定時操作,你會有什麼建議? – momo 2012-02-10 21:55:44

+0

@BigMoMo我還沒有實現一個動畫引擎,但爲什麼不實施一個線程,每隔25ms睡一覺,然後繪製動畫?我假設你的AS和JS動畫在計算機上運行平穩,這可能比你的android手機擁有更多的處理能力。 – onit 2012-02-10 22:00:52

+0

感謝您的線索想法 - 我可能會嘗試。 +1 – momo 2012-02-10 22:09:23