1

これが正しい方法であるかどうか、私は混乱しています。私を修正してください。基本的に、canvas.drawTextメソッドを使用してカスタムビューにテキストを描画しています。テキストは数値 (金額) です。イベントが発生したときに、テキストを別の数値 (例: 100 => 800) にアニメーション化しようとしています。

onDrawこれは、メソッドと呼び出しcanvas.drawTextでfor ループ カウンターを使用しinvalidate()て、最終的な数値に達するまで実行できることを認識しています。しかし、私のアプリは立ち往生しています。

更新されたコード:

コードを更新しました。これで、アプリはスタックしなくなりました (Simon のアドバイスによると)。しかし今では、すべての数字 (1 ~ 99) を一度に描画するだけです。ループを遅くする方法がわかりません

public class CustomView extends View implements OnTouchListener{

   private Canvas main_canvas;

   //...Other codes like, initialization, paint etc!...//

   @Override
   protected void onDraw(Canvas canvas) {
      main_canvas = canvas;
   }

   public boolean onTouch(View v, MotionEvent event) {
      switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
      //...Some action...//
      case MotionEvent.ACTION_MOVE:
      //...Some action...//
      case MotionEvent.ACTION_UP:
      runTextAnimation();
      }
   }

   private void runTextAnimation() {

        for(int i=1; i < 100; i++){
            main_canvas.drawText(String.valueOf(i), getMeasuredWidth()/2, 100, amountPaint);
            invalidate();
        }
   }

}
4

2 に答える 2

1

Runnableを使用postDelayedし、数ミリ秒間メッセージをキューに入れるために使用することで、これを解決しました。私の検索と考えを絞り込んでくれたサイモンに感謝しなければなりませんが。以下はスニペットです。これが誰かを助けることを願っています。乾杯。

    private Handler mHandler;
    private int i;

    mHandler.post(mUpdate); //call this to run

    private Runnable mUpdate = new Runnable() {
               public void run() {

                main_canvas.drawText("Secret Text"+i, getMeasuredWidth()/2, 50, textPaint);

                i++; // incrementing the value

                mHandler.postDelayed(this, 60);
                invalidate();
                }
        };

ところで、上記のスニペットは無限カウンターです。いつか停止するように注意してください。

于 2012-10-25T09:42:52.300 に答える
0

onDraw() で invalidate() を使用しないでください!

invalidate() により onDraw() が呼び出され、次に invalidate() により onDraw() が呼び出され、次に invalidate() - アイデアが得られます。ループは onDraw() の外にある必要があり、無効化を使用してビューを更新します。ただし、ループが速すぎると、更新がキューに入れられるため、すべての更新が表示されない可能性があることに注意してください。

スレッドをしばらくスリープさせるには:

Thread.sleep(50);

これは 50 ミリ秒間スリープします。試してみてください。ただし、UI スレッドで Runnable を使用する方がより良い解決策になると思います。

于 2012-10-18T18:42:11.600 に答える