public class SurfaceViewTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); }
private static class SampleView extends SurfaceView implements SurfaceHolder.Callback {
public SampleView(Context context) { super(context); SurfaceHolder holder = getHolder(); holder.addCallback(this); }
public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(); try { Paint fontPaint = new Paint(); fontPaint.setTextSize(15f); fontPaint.setColor(Color.WHITE); canvas.drawText("Wilddog's SurfaceView Test", 10, 40, fontPaint); } finally { if (canvas != null) holder.unlockCanvasAndPost(canvas); } }
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
public void surfaceDestroyed(SurfaceHolder holder) {} } } |
몇가지 특이한 점만 설명을 드리도록 하겠습니다.
- surfaceDestroyed: Surface가 Destroy된 경우 호출됨. 여기서 필요한 자원 해제 작업을 수행.
5.SurfaceHolder#lockCanvas() & SurfaceHolder#unlockCanvasAndPost(Canvas c)
더블 버퍼링은 스윙이나 OpenGL에서도 사용되는 고전적인 방법으로 애니메이션과 같이 여러 이미지를 번갈아 보여주어야 하는 경우 Back-Buffer에 이미지를 미리 그린 다음 화면에 바로 표시하여 이미지 처리 성능을 향상 시키는 방법입니다.
안드로이드에서도 역시 더블 버퍼링을 제공하고 있습니다. lockCanvas를 통해 얻어진 Canvas에 그림을 그리는 것은 Back-Buffer에 그리는 것으로 화면에 전혀 표시되지 않습니다. 반드시 unlockCanvasAndPost를 수행해주어야 비로소 작성된 이미지는 화면에 표현됩니다. 따라서 애니메이션 처리를 하시려면 애니메이션 관련 루프 내에서 lockCanvas와 unlockCanvasAndPost룰 반복적으로 수행해야 합니다.


