2010-03-11 11 views
16

나는 애니메이션을 그리려고합니다. 이렇게하려면 onDraw() 메서드를 확장하고 재정의했습니다. 내가 기대할 수있는 것은 onDraw()가 호출 될 때마다 캔버스가 내가 놓은 상태에있을 것이고, 캔버스를 지우거나 그 부분을 그릴 수 있다는 것입니다. (이것은 SurfaceView를 사용했을 때 어떻게 작동했는지입니다.)하지만 캔버스가 다시 돌아올 때마다 이미 해제됩니다. 내가 그것을 지울 수없는 방법이 있습니까? 또는 비트 맵에 이전 상태를 저장하여 비트 맵을 그릴 수 있고 그 위에 그릴 수 있습니다.안드로이드 View.onDraw() 항상 깨끗한 캔버스가 있습니다

답변

28

방법이 있는지 확실하지 않습니다. 그러나 내 사용자 지정보기에 대해 나는 onDraw()가 호출 될 때마다 모든 것을 다시 그리거나 비트 맵으로 그려서 질문에 제안한 것처럼 비트 맵을 캔버스에 그립니다. 여기

내가이

class A extends View { 

    private Canvas canvas; 
    private Bitmap bitmap; 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     if (bitmap != null) { 
      bitmap .recycle(); 
     } 
     canvas= new Canvas(); 
     bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 
    } 
    public void destroy() { 
     if (bitmap != null) { 
      bitmap.recycle(); 
     } 
    } 
    public void onDraw(Canvas c) { 
     //draw onto the canvas if needed (maybe only the parts of animation that changed) 
     canvas.drawRect(0,0,10,10,paint); 

     //draw the bitmap to the real canvas c 
     c.drawBitmap(bitmap, 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null); 
    } 
} 
+0

나는 이것을 단지 조금 전에 이해했다! 의견을 보내 주셔서 감사합니다! – CaseyB

+0

버퍼에 그리기는 잘 작동하지만이 거대한 drawBitmap() 메서드는 FPS를 많이 먹습니다. ( –

+0

지금은 나에게 병목이됩니다. 이전 상태를 복원 할 때마다 onDraw에서 전체 화면 비트 맵을 그리면 고해상도 장치의 FPS에 거의 영향을 미치지 않습니다. Kindle 8.9 3rd gen with 2560x1600). 캔버스가 이전 상태를 유지하도록하는 방법은 실제로 없습니까? OpenGL을 심화하면 성능 문제가 해결 될 수 있지만 시간적으로는 다릅니다. –

1

기본보기와 surfaceView의 차이점을 보려면 here 모양이 있어야합니다. surfaceView에는 드로잉을위한 전용 레이어가 있습니다.이 레이어는 이전에 그린 그림을 추적합니다. 이제 기본 뷰에서이 작업을 수행하려는 경우 itemized overlay for the mapview과 같이 배열에 그리는 각 항목을 넣을 수 있습니다. 거의 같은 방식으로 작동해야합니다.

+0

나는 그 페이지를 보았다. 사실 그 페이지가 처음에는 SurfaceView를 사용하게되었지만 SurfaceView는 투명 배경을 가질 수 없습니다. 다른 뷰 위에 앉아있을 수 있도록이 위젯이 필요합니다. – CaseyB

+0

다음 drawable 배열을 시도 할? – Sephy

+0

현대 Android에서는 OpenGL 경로로 이동하려는 경우 텍스처보기를 사용할 수 있습니다. – Adam

0

기대가 캔버스가되지 않습니다에게/현실 : 승 당신이 그것을 왼쪽 길을 JIB하지 않습니다 어떻게이지만, 대신 빈. 그릴 수있는 객체의 ArrayList (canvas.drawCircle(), canvas.drawBitmap() 등)를 만든 다음 OnDraw()의 ArrayList를 반복합니다. 나는 그래픽 프로그래밍에 익숙하지 않지만 이것을 작은 규모로 사용했다. 어쩌면 훨씬 좋은 방법이있을 것입니다.

+0

캔버스를 만드는 경우입니다. 그렇게하면 그려지는 것을 완벽하게 제어 할 수 있습니다. – CaseyB

+0

Arraylist 대신 그림 호출을 기록하기 위해 Picture 클래스를 사용할 수 있습니다. –

관련 문제