ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Canvas사용법
    과거...../개발일지 2010. 11. 16. 09:30

    onDraw나 dispatchDraw내에서 사용시에 파라미터로 canvas를 이용해서 사용한다
    물론 Bitmap을 만들거나 할때도 canvas를 이용하지만 중요한내용은 이것이 아니니까 패스~~

    캔퍼스를 사용할시에 틀별히 정해진 규정은 없지만 보편적으로 권하는 방식이 있다.
     

       1. canvas.save();   à push

       2. transform matrix;

       3. draw;

       4. canvas.restore(); à pop

    캔퍼스를 사용하기 전(변형을 하기전:회전, 원점 이동 등....)환경을 save함수를 이용해서 저장한 후
    캔퍼스를 변경해서 그린 후 restore()함수를 통해 캔퍼스를 사용하기 전 환경으로 돌리는 것이다.

    맨 처음에 사용할 시에는 save(),restore()를 왜 사용할까 라는 생각을 해서 사용하지 않고
    그냥 draw부분만 사용하였다.
    물론 내가 사용하는 부분은 캔퍼스를 이동한다거나 회전을 하는것이 아니라 캔퍼스안에 포함된
    각각의 비트맵을 회전해서 그려주었기때문에 필요는 없었다.
    but.... 저렇게 사용되기를 권장한다는것!!!(혹시 모르니까~~)

    그럼 예제를 통해서~~~
    밑의예제는 자동차를 그리는 예제인데(베트맨 차란다)  canvas의 save().restore()를 왜 사용하는지
    잘 알아 볼 수 있는 예제이다.

    일단 캔퍼스를 save(), restore()은 스택구조로 저장된다.
    save()는 현재 캔퍼스의 상태를 저장 restore()은 다시 복원이라고 생각한다.
    모 흔히들, save()는 push....restore()은pop으로 말한다.
    밑의 예제를 save() 나 restore()를 지워보거나 연속해서 사용하면서 충분히 이해 할 수 있을거라고
    생각한다.~~
     

    package com.mh.android.test;

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Camera;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.view.View;

    public class HelloAndroidAgain extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MyTestView(this));
    }

    private static class MyTestView extends View {

    public MyTestView(Context context) {
    super(context);
    setMinimumWidth(200);
    setMinimumHeight(200);
    //camera = new Camera();
    }
    private Camera camera = new Camera();
    @Override
    protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    camera.save();
    camera.rotateY(60f);
    camera.applyToCanvas(canvas);

    canvas.drawColor(Color.DKGRAY);
    Paint paint = new Paint();
    paint.setTextSize(24);

    //front left wheel
    canvas.save();
    canvas.translate(50f, 50f);//xCtr, yCtr
    paint.setColor(Color.GREEN);
    canvas.drawCircle(0, 0, 30, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(“FL”, -10, 10, paint);//string
    canvas.restore();

    //front right wheel
    canvas.save();
    canvas.translate(150f, 50f);
    paint.setColor(Color.GREEN);
    canvas.drawCircle(0, 0, 30, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(“FR”, -10, 10, paint);
    canvas.restore();

    //rear left wheel
    canvas.save();
    canvas.translate(50f, 150f);
    paint.setColor(Color.GREEN);
    canvas.drawCircle(0, 0, 30, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(“BL”, -10, 10, paint);
    canvas.restore();

    //rear right wheel
    canvas.save();
    canvas.translate(150f, 150f);
    paint.setColor(Color.GREEN);
    canvas.drawCircle(0, 0, 30, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(“BR”, -10, 10, paint);
    canvas.restore();

    //body
    canvas.save();
    canvas.translate(100f, 100f);
    paint.setColor(Color.RED);
    canvas.drawRect(-50, -50, 50, 50, paint);
    canvas.restore();

    camera.restore();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
    }

    }
    }



    공부한 출처: 

    http://maohao.wordpress.com/2009/09/30/canvas-save-canvas-restore/



Designed by Tistory.