在 android 中开发绘画画布应用程序时,我需要跟踪所有点并且必须在另一个画布中重新绘制它。现在我能够跟踪所有点,但不知道如何在绘制和重绘的情况下同步点绘制,即用户应该在绘制的同时重绘点。我怎样才能做到这一点?
1 回答
不确定这是否是您正在寻找的答案,但我会用某种时间戳记录事件,实际上是到下一点的时间差。就像是:
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));
但是,我建议使用常量而不是硬编码数字。
希望这可以帮助