CalendarView
처음에 달력을 만들때는 아주 간단하게 생각했다.
달력 - 날짜 - 정방형 - 많다 - GridView - 다음달 - ViewPager - 만세
그리고 아주 간단한 문제를 아주 복잡하게 구현했다.
기본적인 기능들을 넣다보니 참으로 덕지덕지 바른 형태의 달력이 탄생했다.
구조를 대략적으로 적어보면
Acitivity - ViewPager <-> FragmentStatePagerAdapter
- Fragment - GridView <-> Adapter
- View
대충 감이 올것 같은데.. ViewPager의 각 Item으로 달을 표시했고, 달에 포함된 날짜를 GridView로 구현을 했다.
참 쉽게 했다.
그런데 문제는 느리다.
초기화 속도가 1초에서 길게는 2초까지 갔다.
영 마음에 안들었다. 사용자는 빨리빨리 표시되지 않는 화면에 실증이 날게 분명했다. 그리고 마켓에 배포된 앱들 대부분의 로딩속도는 상당히 빨랐다.
그래서 탐구 대상이 된 구글 캘린더.
똑같이 ViewPager로 구현을 했지만, GridView가 아니다. CustomView를 사용한것 같다.
실제로 내가 만든 View의 로딩속도중 느린 구간은 GridView를 초기화 하는 부분이었다.
그래서 나도 CustomView를 만들기로 결정했다.
그렇게 탄생한 달력
View 구조
CalendarView와 CalendarItemView를 새로 만들었고, touch시 원 표시는 onDraw에서 그렸다.
CalendarView는 CalendarItemView의 부모가 되고, CalendarItemView를 배치하는 역할을 한다.
오늘 표시가 되고, 선택한 날짜 표시, 그리고 event가 있는 날의 하단 점 표시도 된다.
관련 소스는
근데, 구글이 CalendarView를 이미 내놨더라. 흠...................