2012-02-10 7 views
2

私は、Android 2.2をターゲットとするカスタムトゥイーンエフェクトに取り組んでいます。これはまっすぐなViewアニメーションではありません(多くのことがトゥイーンの進行状況に基づいて行われています)ので、2.2で利用可能なAnimationクラスは十分ではありません(アニメーターはこれを実行しますが、Androidのカスタムトゥイーン - ScheduledThreadPoolExecutorの対タイマー、または代替

私は基本的なロジック(JSを移植し、私が以前書いたトゥイーンエンジンなど)を実装しました、それが正常に動作するようですが、少し遅いです。たとえば、JSやASで25msの間隔を置くと、スムーズな視覚効果が得られますが、Androidの実装では「不気味」に見えます。間隔を10msに短縮するといくつか役立つように見えますが、組み込みのものほど滑らかではありませんアニメーション。

私はTimerとTimerのタスクを使用しています - 私はScheduledThreadPoolExecutorが "優先"であることを読んだことがありますが、私が読んだことから利点は例外処理と複数のタスク1つのトゥイーンを稼働させる)。

は特に遅いタイマーですか? ScheduledThreadPoolExecutorがより効率的ならば?私が気づいていない別の、より良い選択肢がありますか?私はのScheduledThreadPoolExecutorで見る

TYIA

答えて

4

、答えはただまっすぐハンドラとの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は、楕円形の時間を測定し、デルタ(ellapse/duration)を返す非常に単純なクラスです。 getEasedProgressでは、そのデルタに基本的なイージング補間が適用されます。正しい方向に私を指しているためメーリングリストGoogleのAndroid開発者からpskinkする

感謝。

2

主な利点は、あるスレッドが他のスレッドが定義されたプールから使用することができます何とかhungupされている場合は、スレッドの数をプールすることができます。ここで興味深いですSO discussion on this topic.

+0

コメントありがとうございます。あなたが含むリンクは、このページへのリンク、btwです。このような短時間、高インターバル・タイムド・オペレーションでは、何をお勧めしますか? – momo

+0

申し訳ありません!正しいURLを追加しました。私はタイマーに行くだろう。 – kosa

+0

そのリンクの良い情報 - 私はデーモンを使用していなかったので、今それを試みます。 +1 – momo

2

あなたはThreadPoolを必要としないため、あなたのアニメーションを管理するためにただ1つのスレッドが必要なので、ScheduledThreadPoolExecutorは必要ありません。減速はおそらくアニメーションエンジンの実装にあります。タイマーがどれほど効果的かわからない。将来サーチャーのための

+0

コメントありがとうございます。アニメーションエンジンはまっすぐな数学であり、非常に高速でなければならない(その数学に反応するコード - エンジン自体ではなくリスナーである - がそうでないかもしれない)。このような短時間、高インターバル・タイムド・オペレーションでは、何をお勧めしますか? – momo

+0

@BigMoMo私はアニメーションエンジンを実装していませんが、25msごとにスリープしてアニメーションを描画するスレッドを実装しないのはなぜですか?私はあなたのASとJSのアニメーションがコンピュータ上でスムーズに動くと想定しています。これはおそらくアンドロイドの電話よりもはるかに処理能力が高いでしょう。 – onit

+0

スレッドのアイデアに感謝します。 +1 – momo

関連する問題