본문 바로가기

Android/Palette

[모든 팔레트 정복] 4. Widgets(위젯) part 2

안녕하세요? 닉네임간편입니다. 이번 시간에는 저번 시간에 이어 팔레트 중 Widgets 요소에 대해서 계속해서 알아보겠습니다.

1. RatingBar

SeekBar와 ProgressBar를 상속한 것이며 별의 개수로 상태를 표시합니다. 사용자는 드래그하거나 터치함으로써 별의 개수를 설정할 수 있습니다.

별의 개수는 요소의 너비가 wrap_content로 설정되었을 때 전부 표시되며, 만일 그 이외의 값이 설정된다면 어떻게 표시될지 예측할 수 없습니다.

isIndicator 속성을 통해 사용자가 바꿀 수 없는, 단지 표시하는 역할만 하는 RatingBar를 만들 수 있습니다. numStarts 속성을 통해 화면에 표시될 별의 개수를 설정하고, rating을 등급을 매길 수 있습니다. stepSize를 통해 한 번에 추가될 별의 크기를 설정할 수 있습니다.

2. SearchView

ActionBar에 검색 메뉴를 만들거나, submit 버튼 없이 엔터를 눌렀을 때 바로 검색이 되도록 만들고자 할 때 사용되는 요소입니다.

검색을 할 때 추천 검색어를 리스트 형식으로 표시할 수 있으며, 추천 검색어를 선택하면 검색할 수 있습니다.

돋보기 버튼을 누르면 검색할 수 있으며 X버튼을 누르면 검색이 닫아집니다.

3. TextureView

비디오나 OpenGL 장면과 같은 콘텐츠 스트림을 표시할 때 사용하는 요소입니다. SurfaceView와 비슷한 역할을 하며 뷰 계층 구조의 시티즌입니다. SurfaceView보다 알파 및 회전 처리가 뛰어나지만, 다른 동영상을 합성하는 경우 성능적인 면에서 떨어집니다. 만일 TextureView 위에 다른 뷰가 배치되면 콘텐츠 업데이트로 인해 다른 뷰 요소가 다시 그려질 수 있기 때문입니다.

4. SurfaceView

빠른 그래픽 그리기를 지원하는 뷰입니다. 화면을 그리는 동작을 위한 독립적인 스레드를 만들어 실행시키며, 따라서 앱의 자원 사용 상태에 상관없이 실시간으로 뷰를 그릴 수 있습니다.

원래 안드로이드에서는 메인 스레드 이외의 스레드에서는 앱의 UI 구성요소에 대한 직접적인 접근이 허용되지 않습니다. 하나의 프로세스 이내에 여러 개의 스레드는 공통의 메모리 자원을 공유하는데, 이때 여러 스레드가 같은 자원을 동시에 접근했을 때 데드락이 발생할 수 있기 때문입니다.

따라서 SurfaceView는 Surface Holder라는 것을 이용하는데, 이는 뷰가 그려지는 버퍼입니다.

SurfaceView Holder에서는 주로 surfaceCreated()와 surfaceDestroyed() 메서드를 사용합니다. surfaceCreated() 메서드는 새로운 스레드를 생성하고 시작하여 그리는 작업을 수행합니다. surfaceDestroyed() 메서드는 스레드를 다시 메인 스레드와 합쳐주고 서피스를 해제하는 작업을 합니다.

SurfaceView Holder의 핵심 기능은 캔버스의 '잠금'을 제어하는 것입니다. lockCanvas() 메서드를 통해 잠겨진 캔버스를 참조할 수 있으며, 이 캔버스에 그림을 그린 후 unlockCanvasAndPost() 메서드를 통해 락을 해제하면 캔버스에 그렸던 뷰가 SurfaceView를 통해 화면에 보여지게 됩니다. 이 방식은 그림을 미리 그렸다가 나중에 화면에 띄우기만 하는 더블 버퍼링 방식으로, 이로인해 뷰를 그리는 속도가 향상됩니다.

 

주로 사용되는 예시로는 카메라 앱 위에 그림이 그려지는 경우가 있습니다.

다들 포켓몬고를 하셨거나, 하시진 않았더라도 들어본 적이 있을 것입니다. 해당 게임을 하다보면 카메라 앱 위에 포켓몬이 위치한 걸 볼 수 있는데, 이때 SurfaceView를 통해 카메라 위에 사진을 위치시킬 수 있는 것입니다.(물론 실제로 SurfaceView가 적용되었는지는 모르겠습니다...)

5. Divider

요소들을 구분하기 위한 선을 그려주는 요소입니다. background를 ?android:attr/listDivider로 설정해주면 됩니다. 각 방향별로 수평 방향 divider가 필요하다면 너비를 match_parent로 설정하고 높이를 1dp로 설정하며, 수직 방향 divider가 필요하다면 그 반대로 하면 됩니다.

사실 요소 자체가 Divider란 요소라기 보다는 기능에 초점을 맞춰서 이름지어진 'View'입니다.

6. 마무리

이번 시간은 저번 시간에 다루지 못했던 Widgets(위젯)에 대해서 모두 알아보았습니다. 이제 위젯 요소들은 정복했고, 다음 시간부터는 Layout 팔레트에 대해서 알아보겠습니다.

728x90
반응형