본문 바로가기
SKIA

2.3 Canvas Drawable, DRRect

by SimonLee 2025. 5. 5.

아래 모양을 렌더링 해보자.

drawable

 

struct MyDrawable : public SkDrawable {
    SkRect onGetBounds() override { return SkRect::MakeWH(50, 100);  }
    void onDraw(SkCanvas* canvas) override {
       SkPath path;
       path.conicTo(10, 90, 50, 90, 0.9f);
       SkPaint paint;
       paint.setColor(SK_ColorBLUE);
       canvas->drawRect(path.getBounds(), paint);
       paint.setAntiAlias(true);
       paint.setColor(SK_ColorWHITE);
       canvas->drawPath(path, paint);
    }
};

void draw(SkCanvas* canvas) {
    sk_sp<SkDrawable> drawable(new MyDrawable);
  SkMatrix matrix;
  matrix.setTranslate(10, 10);
  canvas->drawDrawable(drawable.get(), &matrix);
}

 

Drawable을 렌더링 하기 위해서는 SkDrawable을 상속받은 커스텀 클래스를 생성한다.

void onDraw(SkCanvas* canvas) override 함수를 오버라이드 한다.

- 내부에 렌더링할 것들을 그려준다.

 

canvas->drawRect(path.getBounds(), paint)

- Path의 바운더리를 파랑색으로 그려준다.

 

cnavs->drawPath(path, paint)

- Path의 영역을 그려준다.

- 시작점은 (0,0)

- 컨트롤 포인트 (10, 90)

- 엔드 포인트(50, 90)

베지어 곡선의 곡률 W 값이 클수록 아래로 볼록한 그래프가 생성이 된다.

 


아래 모양을 렌더링 해보자.

 

 

void draw(SkCanvas* canvas) {
   SkRRect outer = SkRRect::MakeRect({0, 0, 210, 200});
   SkRRect inner = SkRRect::MakeOval({0, 0, 210, 200});
   SkPaint paint;
   paint.setAntiAlias(true);
   canvas->drawDRRect(outer, inner, paint);
}

 

MakeOval 함수는 LTRB 영역에 딱 맞는 타원을 만들어 준다.

 

canvas->drawDRRect(outer, inner, paint);

- DRRect = Difference of Rounded Rect

- outer round rect에서 inner round rect를 빼고 남은 영역을 렌더링

 

 


아래 모양을 렌더링 해보자.

void draw(SkCanvas* canvas) {
   SkRRect outer = SkRRect::MakeRect({20, 40, 210, 200});
   SkRRect inner = SkRRect::MakeRectXY({60, 70, 170, 160}, 10, 10);
   SkPaint paint;
   paint.setAntiAlias(true);
   paint.setStyle(SkPaint::kStroke_Style);
   paint.setStrokeWidth(20);
   paint.setStrokeJoin(SkPaint::kRound_Join);
   paint.setColor(SK_ColorBLUE);
   canvas->drawDRRect(outer, inner, paint);
   
   paint.setStrokeWidth(5);
   paint.setColor(SK_ColorWHITE);
   canvas->drawDRRect(outer, inner, paint);
}

 

setStyle 종류  ( 도형을 어떻게 그릴것인지 결정 )

style 종류 의미 설명 시각적 예
kFill_Style 채우기 전용 도형 안쪽을 채움 ■ ●
kStroke_Style 선(테두리)만 그림 내부는 비우고 외곽선만 그림 □ ○
kStrokeAndFill_Style 채우고 선도 그림 안도 채우고 테두리도 그림 ◎ ◉

 

 

setStrokeJoin 종류 ( 코너를 어떻게 그릴것인지 결정 )

stroke join 종류 의미 설명 시각적 예
SkPaint::kMiter_Join 날카로운 모서리 (뾰족하게) 연결 기본값, 각도가 작을수록 길게 튀어나올 수 있음 ┏━, ⎾ ┓
SkPaint::kBevel_Join 모서리를 뚝 자른 형태로 연결 뾰족함 없이 평평하게 잘림 ◣, ↘
SkPaint::kRound_Join 모서리를 둥글게 연결 부드러운 느낌, 곡선 UI에 적합 ⤾, ⤿, ◎

 

 

outer rect는 (20, 40) ~ (210, 200) 영역

innter rect는 (60, 70) ~ (170, 160) 영역, radius 10을 주어서 round corner를 적용함.

outer rect 내부에 inner rect가 포함되어 있는 상황이다.

 

첫번째 렌더링할때는

style을 kStroke_Style로 설정하여 테두리만 렌더링 한다.

코너의 경우 모서리를 둥글게 처리한다.

선의 굵기를 20px로 설정하고, 테두리의 색을 파랑색으로 설정 후 렌더링

 

두 번째 렌더링할때는 

선의 굵기를 5px로 설정하고, 테두리의 색을 하얀색으로 설정 후 렌더링

첫번째 테두리의 내부에 하얀 테두리가 또 생성이 된다.

 

'SKIA' 카테고리의 다른 글

2.4 Canvas drawImage  (0) 2025.05.05
2.1.1 Canvas Clip Rect & Region  (0) 2025.05.02
2.1.0 Canvas Clip Path  (0) 2025.04.30
1. SkCanvas Overview  (0) 2025.04.29