2011-03-29 5 views
0

내 앱에서 사용자가 그림을 그릴 수있게합니다. 전체 화면이 채워지면 앱에 일부 옵션이 표시됩니다.사용자가 전체 화면을 그렸는지 여부를 감지합니다.

예를 들어 화면 픽셀 배열을 유지하려고합니다. pixel = new int[width][height];과 픽셀을 칠할 때마다 표시하지만 내 문제의 나쁜 해결책이라고 생각합니다.

사용자가 전체 화면을 그렸는지 여부를 감지하는 방법이 있습니까?

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     X = (int) ev.getX(); 
     Y = (int) ev.getY(); 
     break; 
    } 
    case MotionEvent.ACTION_MOVE: { 
     X = (int) ev.getX(); 
     Y = (int) ev.getY(); 
     break; 
    } 
    return true; 
} 
@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(X, Y, 50, paint); 
} 
+0

배열 대신 카운터는 어떻습니까? 각 픽셀의 Pixel ++를 대칭 이동 한 다음 상한선에 도달하면 확인합니다. –

+0

사용자가 동일한 위치에 페인트 할 수 있으므로 픽셀 ++ 방법이 유효하지 않습니다. – SteD

답변

1

픽셀의 상태를 추적하기 위해 배열을 사용하는 것 외에는 다른 생각을 할 수 없습니다. 그러나 2D 배열은 2 개의 병렬 1D 배열을 사용하는 것보다 느립니다. 그러나 모든 픽셀을 하나의 배열에 넣고 페인트 할 때 요소를 배열에서 제거합니까? 전체 배열을 반복하지 않고 간단히 배열 길이를 0으로 확인할 수 있습니다.

0

나는 당신의 접근 방식 (매트릭스를 유지하는이) 아마 올바른 생각하지만 브러시의 크기가 1 개 픽셀보다 훨씬 큰 경우, 그것은 낮은 해상도 행렬을 유지하기 위해 적합 할 수 있습니다 : 당신은 아마도 픽셀 정밀도의 정확성을 필요로하지 않을 것입니다. 그렇습니다. 이렇게하면 사용자가 화면상의 모든 픽셀을 채우지 않고 빠져 나갈 수는 있지만 메모리가 훨씬 적게 듭니다.

0

대답은 비트 맵을 만드는 것일 수 있습니다. 모든 페인트는 비트 맵에서 발생하고 캔버스에 맞추어 동기화 상태를 유지합니다.

주기적으로 Bitmap.copyPixelsToBuffer를 호출하여 데이터를 IntBuffer에 복사하는 타이머와 백그라운드 스레드에서 검사가 수행됩니다. 그런 다음 한 번에 하나의 픽셀 (int32) 버퍼를 이동할 수 있습니다. 모든 픽셀이 동일한 값이면 화면이 채워지고 응답으로 원하는 것을 할 수 있음을 알 수 있습니다.

보다 효율적인 구현은 사용자의 그림을 백그라운드 타이머의 트리거로 사용하고 전체 화면을 다시 검사하지 않고 마지막 검사 이후에 사용자가 그린 경계선을 사용자 지정으로 제한 할 수 있습니다.

0

사용자가 페인트 할 수없는 배경색을 사용하십시오. 픽셀이 배경색에서 새로운 색상으로 바뀔 때마다 카운터에 1을 더합니다 (AD의 제안 참조).

관련 문제