
- 캔버스 : 🗒 도화지
- 페인트 : 🖌️ 붓



이런 식으로 사용할 수 있다.



@override부터): 클래스가 생성 or 무효화되면 실행되는 메소드를 정의한다.페인트.setAntiAlias() 메서드는 도형의 끝을 부드럽게 처리해준다. 페인트.setColor()로 도형의 색을 Paint에 저장한다.페인트.setColor()로 지정한 색은 다른 색으로 지정하기 전까지 계속 유지된다. 캔버스.drawline(시작x, 시작y, 끝x, 끝y, 페인트)로 선을 그린다. 페인트.setStrokeWidth()로 그려질 도형 or 글자 외곽선 두께를 설정한다.페인트.setStyle(Paint.Style.FILL)로 도형의 내부를 채운다. 얘도 한 번 설정하면 변경 전까지 계속 유지된다. 페인트.setStyle(Paint.Style.STROKE)로 도형의 내부를 채우지 않는다. 얘도 한 번 설정하면 변경 전까지 계속 유지된다. Rect 객체명 = new Rect(x,y,x1,y2)으로 사각형을 그리기 위해 Rect 객체를 생성하고 4개의 좌표를 미리 만든다. Rect 클래스는 int형을, RectF 클래스는 float형 값을 갖는다.캔버스.drawRect(사각형객체명, 페인트명)으로 사각형을 그린다. 캔버스.drawRoundRect(사각형객체명, 타원의 x축 반지름, 타원의 y축 반지름, 페인트명)으로 사각형의 모서리를 둥글게 처리한다.캔버스.drawCircle(중심x, 중심y, 반지름, 페인트명)으로 원을 그린다.
moveTo() 메서드로 해당 점으로 이동한 다음, lineTo() 메서드로 점을 계속 추가한다. 캔버스.drawPath(패스명, 페인트명)으로 생성한 패스를 그린다.페인트.setTextSize()로 글자 크기를 설정한다.캔버스.drawText("출력할문구", x, y, 페인트명)으로 글자를 해당 좌표에 출력한다. 페인트.setStrokeCap() : 캔버스.drawOval(x, y, width, height) : 사각형 안에 내접하는 타원 그리기페인트.setColor(Color.argb()) : 투명도까지 설정가능한 색 설정 메서드🍪 Canvas의 메서드들 (점, 선, 원, 사각형에 기본 도형을 그린다.)
📍 drawPoint(x, y, paint) : (x,y) 좌표에 점을 찍는다. 📍 drawLine(startX, startY, stopX, stopY, paint) : (x,y) 좌표부터 (x,y) 좌표에 선을 그린다. 📍 drawCircle(x, y, radius, paint) : (x,y) 좌표에 반지름(radius)만큼 원을 그린다. 📍 drawRect(left, top, right, bottom) : (left, top)와 (right, bottom)의 대각선을 기초로 사각형을 그린다. 📍 drawText(text, x, y, paint) : (x,y) 좌표에 문자를 출력한다. 📍 Paint.setColor(int color) : 그리기 색상 📍 drawARGB(a, r, g, b) : 기존 색상에 alpha가 추가된 것. (투명 : 0xff / 불투명 : 0x00) 📍 drawRGB(r, g, b) : 0~255까지 각 색상의 코드를 적으면 됨. 📍 drawColor(int color) : RED, BLUE 등 원하는 색상을 적으면 된다. 📍 drawPaint(paint) : 설정 값을 적용, 단순한 채우기 📍 drawRoundRect(RectF r, rx, ry, paint) - rx & ry : 모서리의 둥근 정도. 가상의 타원으로 두 값이 클수록 모서리가 둥글다. 📍 drawOval(RectF r, paint) : Oval은 달걀모양, 지정한 사각형 영역에 내접한 원을 그린다. 📍 drawArc(RectF r, startAngle, sweepAngle, boolean useCenter, paint) - startAngle : 3시방향이 0도, 시계방향으로 증가 - sweepAngle : 그리는 각도 크기 - useCenter : (T) 부채꼴, (F) 호 📍 drawLines(float[] pts, paint) : 배열에 저장된 선을 순서대로 그린다. 연결하고 싶으면 시작과 끝 점을 일치시킨다. 📍 drawPoints(float[] pts, paint) : 배열상의 좌표를 꺼내 여러 개의 점을 찍는다.
🍪 Paint의 메서드들 (그리기에 대한 속성 정보를 가지는 객체)
📍 setAntiAlias(boolean) : 경계면을 부드럽게 처리해준다. 📍 setColor(int color) : 단색을 지정한다. 📍 setRGB(r, g, b) : 더 더양한 색상을 지정한다. 📍 setARGB(a, r, g, b) : RGB에 Alpha가 추가된 것이다. Alpha는 투명이냐 불투명이냐를 결정할 수 있다. 📍 setStrokeWidth(width) : 펜 굵기 📍 setStrokeCap(Paint.Cap cap) : 끝 모양 - BUTT : 지정한 좌표에서 선이 끝남 - ROUND : 둥근 모양으로 끝이 장식된다. - SQUARE : 사각형 모양이되 지정된 좌표보다 조금 더 그어진다. 📍 setStrokeJoin(Paint.Join join) : 모서리처럼 선분이 만나 각지는 곳의 모양 - MITER : 모서리를 90도 각진 형태 (Default) - BEVEL : 모서리가 깍인 형태 - ROUND : 둥근 형태 📍 setStrokeMiter(float miter) : 0 이상의 값으로 어느 정도 각도로 뾰족하게 할 것인가 (StrokeJoin의 소속) 📍 setStyle(Paint.Style style) : 외곽선과 내부 중 어느 쪽을 그릴 것인가 - FILL : 채우기만 하며 외곽선 X (Default) - FILL_AND_STROKE : 채우기도 하고 외곽선도 그린다. - STROKE : 채우지는 않고 외곽선만 그린다. 📍 set(Paint src) : 객체끼리 대입 📍 reset() : 초기화 💡 cf) invalidate() : 새로 canvas를 그려준다.

.getAction() 로 터치한 동작을 얻은 후, 각 터치를 switch~case문으로 구분한다. 

선 그리기, 원 그리기 옵션 메뉴 만들기onCreateOptionsMenu( ) 와 onOptionsItemSelected( ) 메소드 자동 완성
onTouchEvent( ) 메소드 자동 완성 후 추가될 부분 작성onTouchEvent() 메소드가 더이상 실행되지 않는다. 즉, 시작점(startX,startY)과 끝점(stopX,stopY)이 결정되는 것이다.invalidate()를 호출하면 화면이 무효화되고 onDraw() 메서드를 자동으로 실행한다. 

BitmapFactory.decodeResource() 로 리소스 이미지에 접근캔버스.drawBitmap(비트맵이미지, 시작x, 시작y, null) 로 화면에 이미지 출력비트맵이미지.recycle() 로 비트맵 리소스 해제
BitmapFactory.decodeFile() 로 SD카드의 이미지에 접근캔버스.drawBitmap(비트맵이미지, 시작x, 시작y, null) 로 화면에 이미지 출력비트맵이미지.recycle() 로 비트맵 리소스 해제

this.getWidth()는 현재 뷰(MyGraphicView)의 너비를 구한다. 현재 뷰의 너비에서 이미지의 너비를 뺀 다음 2로 나눈 위치를 시작점으로 하여 이미지를 출력한다. 결국 화면 중앙에 이미지가 출력된다.rotate( )scale( )translate( )skew( )




30은 블러링 효과를 낼 반지름(크기)이고, NORMAL은 스타일이다.
빛의 xyz 방향 1차 배열: 빛이 비추는 x, y, z방향 배열빛의 밝기: 0~1의 값반사 계수: 5~8이 적당블러링 크기: 볼록하게 표현하기 위한 가장자리의 크기

{10,3,3},{3,10,3},{3,3,10} 으로 변경)

4x5Red, Green, Blue, Alpha의 값은 기본적으로 1이 설정되어 있는데, 이 값을 몇 배로 올리면 색상의 대비(contrast)가 커진다. 
페인트.setColorFilter()를 통해 페인트에 적용한다. 
- 바깥 리니어레이아웃 안에 2개의 리니어레이아웃 생성
- 두 리니어레이아웃의 layout_weight는 1:9 정도로 설정
- 위쪽 리니어레이아웃에 이미지 버튼 6개 생성
- 위젯의 id를 다음과 같이 선언
- 리니어레이아웃 : iconLayout, pictureLayout
- 이미지버튼 : ibZoomin, ibZoomout, ibRotate, ibBright, ibDark, ibGray

- 이미지버튼에 대응할 6개 위젯 변수 선언
- MyGraphicView 클래스 변수를 선언
MyGraphicView정의 : 그림 파일을 중앙에 비트맵으로 출력- pictureLayout을 인플레이트한 후 MyGraphicView를 추가

- 축척에 사용될 전역변수를 선언
- clickIcons( ) 메소드를 정의하고 확대 아이콘 클릭 리스너를 생성
- clickIcons( ) 메소드를 호출
- onDraw( )에
Cavas.scale( )메소드를 추가

clickIcons() 메소드를 정의하고 확대 이미지버튼의 클릭리스너를 만든다. 확대 아이콘을 클릭할 때마다 축척 전역변수가 0.2씩 증가한다. 확대를 위해서는 onDraw() 메소드를 다시 호출해야 하는데 뷰의 invalidate() 메소드는 onDraw()를 자동으로 호출해준다. 예제9-12의 16행에 코딩한다. clickIcons() 메소드를 호출한다. 예제9-12의 14행에 코딩한다. 축소 아이콘도 비슷하게 코딩한다.
이 때ibZoomin은ibZoomout으로,+0.2f는-0.2f로 변경해야 한다.
- 회전에 사용될 전역변수 선언
- 회전 아이콘 클릭 리스너 생성
- onDraw( )에
Cavas.rotate( )메소드를 추가

- 화면 밝기에 사용될 전역변수 선언
- 밝게 하기 아이콘 클릭 리스너 생성
- onDraw( )에 컬러매트릭스 적용

어둡게 하기 아이콘도 비슷하게 코딩한다.
이 때ibBright는ibDark로,+0.2f는-0.2f로 변경해야 한다.
- 채도에 사용될 전역변수 선언
- 회색 영상 아이콘 클릭 리스너 생성
- onDraw( )에 채도 설정 적용

0: 회색조 영상으로 바뀜0~1: 채도 낮게 보임1: 기본1 이상: 채도 높게 보임1→0 혹은 0→1로 변경된다. 즉, 회색과 컬러가 스위칭되면서 바뀌도록 한다. clickIcons() 메소드 내부에 코딩한다.setSaturation() 메소드를 실행하면 그 앞에 설정된 컬러매트릭스 값이 무시된다.