Do it! 안드로이드 앱프로그래밍 8일차 (19.04.16)

2019. 4. 16. 17:45Engineer/안드로이드 앱 프로그래밍

반응형

확실히 Java 기초공부를 하고 나서 다시 안드로이드 앱 프로그래밍 공부를 하니, 이해가 더 잘되는 듯하다. 아직도 생소한 표현이 한두개 있긴하지만 이 것도 Java 를 좀더 공부하면 쉽게 이해 할 수 있을 것 같다. 



 Chapter 06. 그래픽 


   06-1 빨간색 사각형 그리기


빨간색 사각형을 화면에 그리기 위한 단계


1단계 - 새로운 CustomView 클래스를 만든다. view 클래스를 상속하고 Context 객체 하나를 파라미터로 전달받는 생성자 하나로 정의

2단계 - 페인트 객체는 그래픽을 그리기 위해 필요한 속성을 담고 있다. 다라서 페인트 객체를 만들고 속성을 설정한다. 

3단계 - onDraw 메소드는 뷰가 화면에 디스플레이될때 자동으로 호출된다. 따라서 뷰에 그래픽을 그리기 위해서는 onDraw( ) 메[소드 안에서 캔버스 객체에 정의된 메소들 중 원하는 것을 호출하여 그리면 된다. 여기서는 사각형을 그리기위해 drawRect( )를 사용. drawRect( )는 좌표값과 페인트 객체가 필요.  

4단계 -  onTouch( ) 메소드는 터치 이벤트를 처리하는 일반적인 방법을 제공. 따라서 재정의 해서 사용

5단계 - 이렇게 만든 CustomView 클래스를 new연산자를 사용하여 메인 액티비티에 추가. 그리고 setContentView( ) 메소드를 이용하여 화면 전체에 보여준다. 



   06-2 그래픽 그리기


그래픽을 그릴 때 필요한 주요 클래스


canvas 객체를 이용해 호출 할 수 있는 대표적인 메소드



   06-3 그리기 객체로 만들어 그리기


그리기 메소드를 사용하면 다양한 그래픽을 그릴 수 있지만, 그리기 객체를 만들어서 그리는 이유는 그래픽을 그리는 하나의 단위를 그리기 객체로 만들어 두면 각각의 그래픽 그리기 작업을 독립적인 객체로 나누어 관리할 수 있다는 장점이 있다. 긔고 이 객체에 애니메이션을 적용할 수 있다. 


그리기 객체를 사용하는 방법

  1. 리소스 파일 사용 : 프로젝트 리소스에 이미지와 같은 파일을 포함시킨 후 읽어 들여 사용
  2. XML로 정의하여 사용 : 그리기 객체의 속성을 정의한 XML파일을 정의하여 사용
  3. 자바 코드에 객체를 만들어 사용 : 자보 코드에 new연산자를 이용해 그리기 객체를 만든후 사용
뷰가 채워지는 화면의 크기를 알아오기 위해서는 시스템 서비스 객체인 '윈도우 매니저(WindowManager)'를 참조하면 된다. 


그리기 객체는 draw( ) 메소드를 직접 호출하여 그릴 수 있으므로 onDraw( ) 메소드 내에서 호출하되 파라미터로 캔버스 객체를 전달


LinearGradient 객체는 선형 그라데이션을 구현하는데 하나의 직선 그라데이션 축을 따라 서로 혼합되는 여러가지 색으로 영역을  그릴수 있도록 함



   06-4 비트맵 이미지 사용하기


메모리에 만들어지는 이미지는 비트맵(BItmap) 객체로 관리 된다. 따라서 비트맵 객체로 이미지를 그릴수 있다. 이미지 객체가 메모리에 만들어지면 이를 이용해 다양한 조작을 할 수 있으며, 이 이미지는 사진 이미지 이외에도 그래픽을 그릴 수 있는 공간을 제공한다. 더블 버퍼링(Double Buffering)이라는 방법을 사용하면 별도의 공간에 미리 그래픽을 그린 후 뷰가 다시 그려져야 할 필요가 있을 때 미리 그려 놓은 비트맵을 화면에 표시하게 된다. 


BitmapFactory 클래스는 비트맵 이미지를 만들기 위한 클래스 메소드들을 제공하며 이 메소드들은 이미지를 메모리 상의 비트 맵 객체로 만들어 주기 위한 방법을 제공한다. 


이미지를 다른 형태로 바꾸는 과정을 이미지 변환(Transformation)이라 하는데 안드로이드에서는 이미지 변환을 위해 Matrix 클래스가 사용된다. ( ex. 확대대, 축소, 이동, 회전, 뒤틀림)


이미지에 다양한 효과를 내는 데는 마스크(Mask)를 이용 하기도 한다. ( ex. 번짐 효과)



   06-5 페인트 보드 만들기


사용자가 화면에 터치하면서 직접 그릴 수 있도록 하는 방법. 손가락으로 화면을 터치했을때 발생하는 이벤트를 처리하는 onTouchEvent( )를 이용하면 터치되는 곳의 좌표값을 이용하여 그리기 기능을 구현하는 것이 가능. 


뷰 객체에서 setTag( ), getTag( )는 어떤 데이털르 지정해 두고 싶은 경우에 사용. 예를 들어, 리스트뷰나 그리드뷰로 구현된 각각의 아이템이 버튼으로 만들어져있고 그 버튼들이 onClickLIstener를 이용해 클릭 이벤트를 처리하는 경우, 각각의 아이템이 되는 버튼들에 setTag( ) 메소드를 이용해 필요한 데이터를 설정해 둔후, 이벤트를 받는 시점에 뷰 객체에 지정된 데이터를 getTag( )메소드로 참조하면된다. 



   06-6 서피스뷰 사용하기


안드로이드는 3D 지원을 위해 OpenGL ES 라이브러리를 포함하고 있으며 앱에서 3D 객체를 보여주려면 서피스뷰(SurfaceView) 를 사용해야 한다. 서피스뷰를 사용하면 하드웨어 가속이 가능하므로 그래픽 처리가 빠르다는 장점이 있지만 이 객체는 안드로이드의 기본 뷰 체계와는 별도로 구현되었다는 점에 주의해야 한다. 때문에 뷰를 상속하여 그래픽을 그릴 때 사용하던 방법은 사용할 수 없으며 서피스뷰를 이용한 그래픽 그리기 방법을 이해해야 한다. 


서피스뷰는 안드로이드의 기본 뷰 체계에 들어있지 않으므로 아래와 같은 세가지 특징을 가진다. 


 

   06-7 그래픽을 위한 카메라 객체 사용하기


하드웨어 카메라를 제어할 때는 Camera 클래스를 사용한다. 그 중 android.graphics 패키지에 들어있는 Camera 클래스는 보는 시각에 따라 달라지는 입체 효과를 주는 데 사용한다. 시각에 따라 달라진다는 것은 3D 입체로 보여진다는 것을 의미한다. 이 클래스를 사용하면 실제 3D 모델을 사용하지 않고도 입체적으로 보일 수 있도록 그래픽 처리를 하게 된다. 이런 입체 효과를 주는 또다른 예로 커버플로우(CoverFlow)가 있다. 커버 플로우 위젯을 구현하려면 Gallery 클래스를 확장하여 새로운 클래스를 정의할 때 Camera 객체를 사용할 수 있다. 


카메라 객체는 입체감을 주기 위한 그래픽 처리에 사용되지만 2D 그래픽 처리에 사용되는 캔버스 객체가 가지는 그래픽 변환 방식을 거의 동일하게 사용한다. 





반응형