2012-06-23 3 views
1

안드로이드에서 페인팅 캔버스 응용 프로그램을 개발할 때, 나는 모든 점을 추적해야하고 다른 캔버스에서 다시 그려야합니다. 이제 모든 포인트를 추적 할 수 있지만 그리기 및 다시 그리기의 경우 포인트 드로잉을 동기화하는 방법을 알지 못합니다. 즉, 사용자는 드로잉에서와 같이 같은 간격으로 포인트를 다시 그려야합니다. 내가 어떻게 이걸 얻을 수 있니?Android, 그리기 캔버스에서와 같은 시차로 점을 다시 그리는 방법은 무엇입니까?

+1

문제를 다시 명확하게 지정해주십시오. "이제 모든 점을 추적 할 수 있습니다."라고 말한 후, 나는 당신을 이해할 수 없을 때까지 당신의 진술을 이해했습니다. – Antrromet

+1

'그림 그리기'와 같은 선 그림을 재생하려고합니까? – Russ

+0

@russ 예 .. 공유 할 생각이 있습니까? – user1435009

답변

0

찾고있는 답이 맞는지 확실하지 않지만 일종의 타임 스탬프 (실제로는 다음 지점과의 시간차)로 이벤트를 기록합니다. 다음과 같음 :

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

타이밍에 따라 원하는 정확도를 얻을 수 있습니다. 2 초에서 밀리 세컨드의 정밀도가 충분해야합니다. deltaTime을이 지점을 그릴 때까지의 시간 또는 다음 지점을 그릴 때까지의 시간으로 해석 할 수 있습니다 (예제에서 후자를 사용하려고합니다).

직접 타임 스탬프 대신 델타 시간을 사용하는 몇 가지 이유는 실제로 긴 일시 중지를 확인할 수있게하고 재생시 델타 시간을 계산해야하기 때문입니다. 또한 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)); 그러나 하드 코딩 된 번호 대신 상수를 사용하는 것이 좋습니다.

희망 하시겠습니까?

+0

Thurxb for ur interest ... 나는 이것을 확실히 시도 할 것이다. – user1435009

관련 문제