2016-03-20 19 views
2

私は、いくつかの円を描画するカスタムビューと、常に更新される約10個のアーチ(回転とサイズの変更)があります。私はこの全過程をアニメーション化しようとしていますが、キャンバスの下で行うための良いプラクティスを見つけることができませんでした(私は基本を知っています--pxの代わりにdpを使用します)。しかし、アニメーション部分。Android Canvasで図形をアニメーション化するためのベストプラクティス

今私はすべてのオブジェクトをトラフして、将来の位置を決定して描画するために計算を実行しますが、それは不安定に見えます。私が現在やっていることは次のとおりです。

@Override 
protected void onDraw(Canvas canvas) { 
    for(Arch arch : arches) { 
     arch.update(); 
     canvas.drawArc(arch.getRect(), -arch.getCurrentRotation(), arch.getSweepAngle(), true, paint); 
    } 

    //logo.draw(canvas); 

    canvas.drawCircle(width/2, height/2, circle_size, paint_opaque); 

    logo.draw(canvas); 

    int textX = (int) (width/2); 
    int textY = (int) ((height/2) - ((paint_text.descent() + paint_text.ascent())/2)); 

    canvas.drawText(text, textX, textY, paint_text); 
    invalidate(); 
} 

答えて

2

コードにはいくつか問題があります。

  1. あなたのカスタムViewsonDrawのいずれかの重い操作を行うべきではありません。それはアンドロイドの開発の本当に重要な原則です!理想的には、あなたのonDrawメソッド内に描画するだけです。場合によってはCanvasに基づいて何かを計算する必要がありますが、これらの種類のアクションを最小限に抑える必要があります。他の場所で事前に割り当てて計算することができるものはすべて(onDrawではなく)、onDrawから抽出する必要があります。あなたのケースではarch.update()(アニメーションの次の「フレーム」を計算すると仮定します)、textXtextYの計算を別の場所に移動する必要があります。

  2. invalidate()は、基本的には、Viewの再描画をリクエストすることを意味します。 Viewを再描画するときは、onDrawが呼び出されます。だからこそonDrawinvalidate()と呼んではいけません。 onDrawが別のものを要求した場合は、別のonDrawを要求すると、一種の無限ループが発生します。

  3. フレームアニメーションを達成しようとしている場合は、フレームの関連するすべてのパラメータを別のスレッドで計算する必要があります。このパラメータは、更新の間隔を少し待つもので、1つずつ更新するとinvalidate()となります。

関連する問題