상세 컨텐츠

본문 제목

새로운 Control만들기 및 Android의 기본 UI Framework구조

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2011. 5. 2. 12:05

본문

반응형

안드로이드의 기존 class를 상속해서 확장 Control을 구현해보자.

Android의 Base Class를 상속해서 만드는 방법이 있을 수 있겠다.

일단 Control을 만들고자 한다면 안드로이드 UI Framework의 기본 구조를 어느정도는 알고 있어야 한다.

아래 참조 해보자.




위 그림은 Android의 대략적인 Hierarchy이다.(완전히 순서대로 그리진 않았다 좁아서..)

대략적인 설명을 하자면

모든 UI Framework의 공통 형태는 다 비슷하다. 결국 포커스가 이동하고 글씨를 뿌려주고 각 객체들을 담는 그릇 객체의 조상등등
뭐 인간세상도 비슷하다.

Android도 마찬가지이다. 다만 용어가 좀 생소하다.
내 경우엔 Win32와 팜, WIPI을 오래 해와서 인가? 사실 Android의 네이밍들이 상당히 맘에 안든다. 뭔가 다르다는것을 강조 하려고 한것인지 일반적으로 기존에 사용되던 이름들보다는 자기들 나름대로 적은게 많이 보인다.
(솔직히 적응하기 짜장난다. 유추가 안되서 framework이라는게 습득하기 쉬우면 좋겠는데..)

Object
Java해본 사람이야 다 아는 class의 최상위 조상이다.

View
GUI Framework의 가장 기본이 되는 class이다. 이것 또한  나름대로 만들어서 사용할 수 있겠으나. 굳이 그럴필요가 있으려나?
아무튼 이것은 화면을 보여주는 것의 가장 기본단위라고 생각하면 된다. 이것들을 상속 받아서 여러가지 Control이 생성된다.
그 어떤것도 만들수 있다. EditBox, Radio, Panel등등, 사용자 입력에 대한 처리 및 출력이 가능하다.
VCL이나 비베를 해본 사람은 Control class를 생각 해보면 되겠다.

View Group
View에서 파생된 모든 child class들을 다 담을 수 있다. 예를 들어 RadioGroup, ListView등은 다른 Control들을 담을 수 있다.
일종의 GUI Container class라고 볼 수 있다.
VCL이나 비베를 해본 사람은 Panel Class를 생각 하면 딱맞다. Control을 올릴때 사용하는 class이다.

TextView
글씨 출력을 할 수 있는 가장 기초가 되는 class이다. ViewGroup에서도 canvas를 이용해서 그릴수 있지만 이것은 개별 Control이다.
이것을 상속 받아서 Button, EditText, RadioButton등을 만든다.



ex)위에서 주황색 테두리는 ViewGroup, 빨강색은 View또는 TextView를 상속 받은 것들이라고 볼 수 있겠다.
물론 Form2라는 Window는 Activity라고 하면 되겠다.


View class의 onMeasure 함수의 Overload
Android의 UI Control의 가장 기본 class인 View를 상속 받아서 Control을 만들게 되면 무조건 onMeasure를 Overload해서 구형 해야 한다. 이유는 View Class내부에서 생성, 위치 변경(이동)등이 일어날때 자동으로 호출이 되면서 현재 위치에 대한 절대 값과
Control의 Size를 읽어 오기 때문이다.  따라서 이것을 구현해주지 않으면 UI가 정상적으로 보이지 않게 된다.



위와 같이 overload해서 구현을 하게 되는데 onMeasure로 넘어 오는 int변수는 속도 때문에 인코딩 되어서 넘어오는 데이타 값이다. 따라서 값을 찍어보면 알수 없는 "103432432"이런 값이 들어 있다. 그것을 바로 아래의 measure라는 함수로 decode하게 되는데 그 함수의 내부는 MeasureSpec클래스에서 지원하는 함수들로 되어 있다. 이부분의 더 자세한 설명은 SDK Help참조
 
그리고 나서 setMeasureDimension으로 width와 height를 넣는데 이것이 현재 사용하는 Control의 크기를 정하게 된다.
여기에 정의된 값은 아래의 onDraw함수에서 getMeasuredWidth나 getWidth등의 함수에서 불러서 사용할 수 있다.
만약 자신이 새로 만든 Control에서 getWidth를 했는데 정확한 사이즈가 안오고 0이 넘어온다면 그것은 onMeasure함수가 제대로 구현되지 않은 것이다.

이 onMeasure함수가 불리는 타이밍은 onCreate가 호출 되고 나서 바로 호출이 된다. 또는 Control이 이동을 하게 되어도 framework자체적으로 자동 호출 되도록 되어 있다.
 


요로코롬 class의 path를 적어주면 사용이 design time에 바로 적용이 가능하다.
design툴에서 drag&drop로 바로 지원하는 방법이 있을법한데 요건 좀 알야봐야 겠다.
 
 


여기에서 위의 layout.xml에서 적용하면 자연히 r.java파일에 적용이 되서 위 코드처럼 불러 오기가 가능하다.
 
한가지 더 얘기 하자면 Android의 layout이 design time에 보이게되는 것은 어짜피 소스 코드 자체가 인터프리터 이기 때문에
design time에 툴에서 Run시켜서 바로 결과를 볼 수 있는 것이다.


 
 

반응형


관련글 더보기

댓글 영역