1

在 android 中开发绘画画布应用程序时,我需要跟踪所有点并且必须在另一个画布中重新绘制它。现在我能够跟踪所有点,但不知道如何在绘制和重绘的情况下同步点绘制,即用户应该在绘制的同时重绘点。我怎样才能做到这一点?

4

1 回答 1

0

不确定这是否是您正在寻找的答案,但我会用某种时间戳记录事件,实际上是到下一点的时间差。就像是:

class Point {
    int x;
    int y;
    long deltaTime;
}

这取决于您希望时间的精确度。秒到毫秒的精度应该足够好。您可以解释deltaTime为直到应该绘制这一点的时间或直到应该绘制下一个点的时间(我将在我的示例中使用后者)。

使用 deltaTime 而不是直接时间戳的几个原因是,它可以让您检查非常长的暂停,并且无论如何您都必须在回放中计算 delta 时间。也将它用作 long 应该为您提供足够的空间来进行真正冗长的暂停,并让您使用Handler接受长整数的类来表示执行前要等待的毫秒数。

 public class Redrawer implements Handler.callback {
     LinkedList<Point> points; //List of point objects describing your drawing
     Handler handler = new Handler(this); //Probably should place this in class initialization code
     static final int MSG_DRAW_NEXT = 0;

     public void begin(){
         //Do any prep work here and then we can cheat and mimic a message call
         //Without a delay specified it will be called ASAP but on another
         //thread
         handler.sendEmptyMessage(MSG_DRAW_NEXT); 
     }

     public boolean handleMessage(Message msg){
         //If you use the handler for other things you will want to
         //branch off depending on msg.what
         Point p = points.remove(); //returns the first element, and removes it from the list
         drawPoint(p);
         if (!points.isEmpty())
             handler.sendEmptyMessageDelayed(MSG_DRAW_NEXT, p.deltaTime);

     public void drawPoint(Point p){
         //Canvas drawing code here
         //something like canvas.drawPixel(p.x, p.y, SOMECOLOR);
         //too lazy to look up the details right now
         //also since this is called on another thread you might want to use
         //view.postInvalidate
     }

这段代码远非完整或无懈可击。即您可能需要稍后暂停或重新开始重绘,因为用户切换活动或接到电话等。我也没有实现您在何处或如何获取画布对象的详细信息(我认为您有那部分现在已经放下了)。此外,您可能希望跟踪前一点,以便您可以制作一个矩形发送到,View.postInvalidate因为重绘屏幕的一小部分比重绘全部快得多。最后我没有实施任何清理,处理程序和点列表将需要根据需要销毁。

可能有几种不同的方法,有些可能比这更好。如果您担心触摸事件之间的长时间停顿,只需添加检查deltaTime是否大于 10 秒,然后将其覆盖为 10 秒。前任。handler.sendEmptyMessage(MSG_DRAW_NEXT, Math.min(p.deltaTime, 100000));但是,我建议使用常量而不是硬编码数字。

希望这可以帮助

于 2012-06-26T17:19:52.317 回答