1

我很困惑这是否是正确的做法。请纠正我。所以基本上我有一个用canvas.drawText方法在我的自定义视图中绘制的文本。文本是一个数字(金额)。当事件发生时,我试图使文本动画到另一个数字(例如:100 => 800)。

我知道这可以通过onDraw方法和调用中的 for 循环计数器来完成canvas.drawTextinvalidate()直到它达到最终数字。但是我的应用程序卡住了。

更新代码:

我已经更新了代码。现在应用程序不会卡住(根据 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() 之外,并且您使用 invalidate 来更新视图。但要小心,如果你的循环太快,你可能看不到所有更新,因为更新是排队的。

让线程休眠一段时间:

Thread.sleep(50);

这会休眠 50 毫秒。试试看,但我认为在 UI 线程上使用 Runnable 会是更好的解决方案。

于 2012-10-18T18:42:11.600 回答