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

2019. 4. 15. 15:37Engineer/안드로이드 앱 프로그래밍

반응형

Java 기초 공부를 이고잉님의 유투브를 통해 끝냈다. 이제 안드로이드 앱 프로그래밍을 더 잘 이해 할 수 있겠지? 

그리고 김병완 작가의 책에 빠져서 한참 노닐다가 정신을 차려보니 일주일이 넘게 지났다. 독서는 무서운 것이다. 시간을 정해놓고 보던가 해야지....와....




 Chapter 05. 선택 위젯의 사용과 커스텀뷰 만들기 


   05-1 나인패치 이미지 알아보기


버튼 등의 배경으로 이미지를 사용할 경우, 디바이스의 종류에 따라 그 버튼이 디스플레이되는 크기가 달라지게 되는데 이때, 이미지 파일의 해상도에 따라 화면에서 왜곡이 발생할 수 있다. 이를 해결 하는 방법이 나인 패치(Nine Patch)이다. 


나인 패치 이미지를 만들고 싶다면 포토샵과 같은 그래픽 편집 툴을 이용하면된다. 



   05-2 [비트맵] 버튼 만들기


배경이미지를 이용하여 버튼을 만들 경우 눌렀을때 변호가 없어, 눌렀는지 안눌렀는지 알수가 없다는 단점이 있다. 이런 문제를 해결하기 위해 그래픽 이미지로 구성된 버튼을 직접 만들어야 하는데 이런 버튼을 비트맵 버튼이라 부른다.


비트맵은 안드로이드에서 메모리로 로딩한 이미지를 부를때 사용하므로 메모리 상에 만들어진 이미지라고 생각하면 된다. 비트맵 이미지를 이용해 버튼의 상태를 표시하려면 버튼이 눌렸을 때와 떼어졌을 때를 이벤트로 구분하여 처리해야하며 여러 앱에서 재사용하기 위해서는 버튼 클래스로 부터 상속받아서 새로운 클래스로 정의해야 한다. 


뷰가 스스로의 크기를 정할 때 호출되는 메소드는 onMeasure( ), 스스로를 레이아웃에 맞게 그릴 때는 onDraw( )메소드를 호출


Java소스코드에서는 픽셀 단위로만 글자의크기를 지정할 수 있는데 반해, xml 파일로 부터 text의 크기를 참조하도록 만들 경우 dp 단위로 지정할 수 있다. 즉 버튼의 화면 해송도와 상관없이 비율 값으로 보이게 하려면 em 또는 dp 단위로 크기를 지정해야 하는데 xml 파일에 정의 한후 소스 코드에서 불러들이면 가능하다. 


만약 버튼을 눌렀을 때나 땠을 때 원하는 기능을 더 넣고 싶다면 onTouchEvent( ) 메소드를 다시 정의 하면 된다. 



   05-3 리스트뷰 사용하기


선택 기능을 가진 위젯은 사용되는 방식이 다른 위젯과 다르다. 


선택 위젯은 어댑터(Adapter)패턴을 사용하며, 데이터를 위젯이 아닌 어댑터에 설정해야 하며 화면에 보이는 뷰도 어댑터에서 만든다. 리스트뷰에 보이는 각각의 아이템은 결국 어댑터에서 관리하는 데이터와 뷰이다. 


선택 위젯에 보이는 각각의아이템이 화며에 디스플레이되기 전에 어댑터의 getView( )메소드가 호출된다. 이 메소드는 어댑터에서 가장 중요한 메소드로, 이 메소드에서 리턴하는 뷰가 하나의 아이템으로 디스플레이 된다. 대표적인 선택 위젯으로는 '리스트뷰', '스피너(spinner)', '갤러리(Gallery)', '그리드뷰(GridView)' 등이 있다. 

ㅇㄹ

[출처] 마녀표정 님 블로그 링크


getView( )에서 리턴하는 객체가 텍스트뷰나 버튼과 같은 하나의 뷰가 아니라 리니어 레이아웃처럼 여러개의 뷰들을 담고 있는 컨터이너 객체라면 하나의 아이템에 여러 정보를 보여줄 수 있다. 하나의 아이템에 여러 정보를 담아 리스트뷰로 보여줄 때 해야할 일들은 다음과 같다. 

  • 아이템을 위한 XML 레이아웃 정의하기 : 리스트뷰에 들어갈 각 아이템의 레이아웃을 XML로 정의
  • 아이템을 위한 뷰 정의하기 : 리스트뷰에 들어갈 각 아이템을 하나의 뷰로 정의. 이뷰는 여러개의 뷰를 담고 있는 뷰그룹이어야함
  • 어댑터 정의하기: 데이터 관리 역할을 하는 어댑터 클래스를 만들고 그 안에 각 아이템으로 표시할 뷰를 반환하는 getView( ) 정의
  • 리스트뷰 다루기 : 화면에 리스트뷰를 추가하고 아이템이 선택되었을 대 호출될 리스너 객체를 정의

   05-4 스피너 사용하기


윈도우에서 콤보 박스로 불리는 것과 같은 기능. 스피너는 <Spinner> 태그를 사용해 XML 레이아웃에 추가한 후 사용할 수 있다. 



   05-5 그리드뷰 사용하기


화면이 큰 PC 또는 웹에서 자주 사용하는 테이블(Table) 형태와 유사하게 데이터를 보여준다. 리스트뷰나 스피너가 1차원적인 데이터라면 그리드뷰는 2차원적인 데이터, 즉 행과 열이 있는 데이터이다. 그리드뷰의 numColumns 속성 값을 1로 설정함녀 리스트뷰와 동일한 모양이 된다. 



   05-6 복합 위젯 만들기


하나 이상의 뷰를 포함하고 있는 위젯으로 여러 개의 뷰를 하나의 클래스로 정의하여 재사용성을 높이기 우해 만든 위젯. 



   05-7 월별 캘린더 만들기


격자 모양일 수밖에 없으므로 테이블 레이아웃이나 그리드 뷰를 사용하는 것이 좋다. 그리드뷰를 사용하면 필요에 따라 데이터캐싱을 통해 메모리 사용을 줄여준다. 



   05-8 멀티터치 이미지 뷰어 만들기


getPointerCount( )메소드의 리턴값이 1이면 1개의 손가락, 2이면 2개의 손가락으로 터치된 상태이다.  getX(int pointerIndex)와 getY(int pointerIndex) 메소드는 여러개의 손가락이 터치되었을때 각각의 손가락이 가지는 인덱스의 값을 이용해 좌표값을 확인 할 수 있도록 한다. 


이미지의 크기를 확대 또는 축소하거나 이미지를 이동하기 위해 사용할 수 있는 쉬운 방법은 매트릭스 객체를 사용하는 것이다. 매트릭스는 수학적인 연산을 통해 비트맵 이미지의 각 픽셀 값을 변경해 주는데, 이 객체를 사요하기 쉽도록 비트맵 이미지를 확대(postScale( ))하거나 이동(postTranslate( ))하는 메소드가 이미 정의되어있으므로 단순히 메소드를 호출하는 것만으로도 원하는 기능을 만들수 있다. 


터치 이벤트를 지속적으로 처리해 다시 그려주는 과정이 필요하므로 메모리에 비트맵 이미지를 만들어 두고 이 이미지에 미리 그린 후 onDraw( ) 메소드 안에서는 메모리에 만들어 둔 비트맵 이미지를 홤녀에 보여주는 '더블 버퍼링'방식을 사용해야 한다. 





반응형