2012-06-23 43 views
1

在Android上開發繪畫畫布應用程序時,我需要跟蹤所有點並且必須在另一個畫布中重繪它。現在我能夠跟蹤所有的點,但不知道如何在繪製和重繪的情況下同步點繪圖,即用戶應該在與繪圖相同的時間間隙重繪點。我怎樣才能做到這一點?Android,如何重繪與繪製畫布中相同時差的點?

+1

請問您能否再次指明問題,清楚!我理解你的陳述,直到「現在我能夠追蹤所有要點」,之後我無法理解你。 – Antrromet

+1

您是否試圖像'Draw Something'一樣重播線條畫? – Russ

+0

@russ是..你有任何想法分享? – user1435009

回答

0

不知道這是你正在尋找的答案,但我會用一種時間戳記錄事件,真的是到下一點的時間差。類似於:

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

它取決於您對時間的精準程度。秒到毫秒精度應該足夠好。您可以將deltaTime解釋爲應繪製該點的時間或應繪製下一點的時間(在本例中,我將使用後者)。

使用deltaTime而不是直接時間戳的幾個原因是,它可以讓您檢查真正的長時間停頓,並且您將不得不在計算播放時計算增量時間。長時間使用它應該會給你足夠的空間來進行非常長的暫停,並且允許你使用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。最後我沒有實施任何清理工作,處理程序和點數列表將需要根據需要銷燬。

這可能有幾種不同的方法,有些可能比這更好。如果您擔心觸摸事件之間的長時間停頓,只需在大於10秒的時間內添加支票即可,然後將其重寫爲10秒。防爆。 handler.sendEmptyMessage(MSG_DRAW_NEXT, Math.min(p.deltaTime, 100000));但我建議使用常數而不是硬編號。

希望這會有幫助

+0

Thanxb爲你的興趣...我會嘗試這個肯定.. – user1435009