Android 8

[메이플 캘린더] ViewPager2와 TabLayout으로 하이퍼스탯, 어빌리티 프리셋을 좌우 스와이프로 확인해보자

사용 의도하이퍼 스탯과 어빌리티는 프리셋을 3개 가지고 있는데, 이것을 좌우 스와이프로 확인하도록 하고 버튼을 터치해도 좌우 스와이프 애니메이션이 발생하면서 프리셋을 바꾸도록 구현하고자 하였다.좌우 스와이프는 ViewPager2를 활용하면 되지만, 이것을 버튼과 어떻게 연계할지를 고민하였는데 TabLayout을 버튼 형식의 스타일로 만들고 TabLayoutMediator로 ViewPager2와 연동하는 것으로 구현할 수 있었다. 적용 방법ViewPager2와 TabLayout을 배치한다.  st..

[메이플 캘린더] Custom View로 장비 세부정보 UI에 스타포스를 달아보자

사용 의도스타포스 UI는 아이템별로 배치해야 할 별의 위치, 개수, 심지어 별의 간격까지 다르며 이것을 정형화된 View로는 나타낼 수 없다고 판단하여 Custom View를 활용하기로 하였다. 학습 내용 Custom View의 구현은 View의 크기를 측정하는 onMeasure(), View를 측정한 후 화면에 배치한 후 호출되는 onLayout(), View를 배치한 후 View에 무언가를 그리는 onDraw()로 순차적으로 이루어진다.onMeasure() : View의 크기를 확인하거나 ViewGroup인 경우 ViewGroup을 구성하는 Child View들을 통하여 width와 height를 결정한다.onMeasure()는 특별히 return하는 값이 없으며, setMeasuredDimensio..

[메이플 캘린더] Hilt와 Clean Architecture

사용 의도의존성 주입을 위해 Hilt를 사용하기로 하였고, 그에 따라 Clean Architecture에서 지향하는 관심사의 분리를 하기로 하였다. 학습 내용Clean Architecture에서는 구성 요소를 Entity, UseCase, Interface, Framework로 계층적으로 분리한다.Entity : 핵심 비즈니스 로직을 캡슐화하며, 가장 변하지 않고 외부의 어떤 요소로부터 영향을 받지 않는다.UseCase : 애플리케이션을 사용하는 사용자들의 행위를 정의하는 요소이다.UseCase는 Entity로 들어오고 나가는 데이터의 흐름을 조정하고, 비즈니스 로직을 바탕으로 UseCase의 목적을 달성하도록 한다.UseCase는 Entity에 영향을 끼쳐서는 안 된다. Interface Adapter..

[메이플 캘린더] ViewPager2와 Custom View로 캐릭터 정보 조회 날짜를 선택하는 달력을 만들어보자

사용 의도넥슨에서 메이플스토리의 캐릭터 정보를 실시간으로 제공하게 되었으며, 그에 따라 캐릭터 정보를 실시간으로 조회할지, 아니면 날짜를 선택해서 조회할지를 결정하는 기능을 구현하게 되었다.조회 날짜 선택 모드일 때 달력 모양의 이미지 버튼이 생기며, 버튼을 누르면 달력 Dialog가 나오고 여기서 날짜를 선택할 수 있게 하였다.그리고 달력을 좌우 스와이프로 달력을 바꿀 수 있도록 하고 싶었기 때문에, 기존에 사용하던 RecyclerView + ListAdapter가 아닌 ViewPager2를 사용하게 되었다. 학습 내용ViewPager2는 Fragment 간 화면 슬라이드를 가능하게 하는 라이브러리이다.ViewPager2는 화면 슬라이드에 자동으로 애니메이션을 적용할 수 있다. 이 애니메이션은 사실 따..

[메이플 캘린더] 위로 스와이프 시 새로고침 기능을 구현해보자

사용 의도 로비 화면에 이벤트 리스트와 캐릭터 정보가 존재하는데, 시간이 지나면 해당 데이터가 변경될 수 있는데 이를 위해 새로고침 기능이 필요하다고 생각하였다. 보통 위로 스와이프를 하면 새로고침이 이루어지는 앱이 많기 때문에, 어떻게 구현하는지 알아볼 겸 새로고침 기능을 추가하고자 하였다. 학습 내용 Layout을 NestedScrollView로 감싸 Fragment가 스크롤이 가능하도록 만들어주고, 다시 SwipeRefreshLayout으로 감싸준다. 이후 코틀린 내부에서 onRefreshListener를 추가함으로써 스와이프 시 어떤 메소드를 호출할 것인지를 결정한다. 또한 새로고침을 할 때 나오는 새로고침 아이콘의 색상도 변경할 수 있다. 적용 방법 다음과 같이 ConstraintLayout을 ..

[메이플 캘린더] RecyclerView로 원하는 달력 View를 만들어보자

사용 의도 왜 달력을 만들었는가? 오늘 진행하고 있는 이벤트뿐만 아니라, 특정 날에 무슨 이벤트가 진행했는지를 파악하고 싶어 달력을 구현하여 특정 날짜를 클릭하여 해당 날짜에 진행한 이벤트 리스트를 보여줄 수 있도록 하였다. 학습 내용 RecyclerView와 ListAdapter를 이용하여 Item마다 ViewType을 정해놓고 달력 UI를 구현한다. 우리가 달력을 보면 날짜뿐만 아니라 상단에 일월화수목금토를 표시해주는데, 보통 요일과 날짜의 배경색을 다르게 나타내고 있다. 따라서 메이플 캘린더의 달력을 배경색을 날짜는 흰색, 요일은 회색으로 출력되도록 하기 위하여 ViewType을 요일(Header)과 날짜(Date)로 구분하고, 날짜에는 Click Listener를 달아줌으로써 클릭 시 이벤트 리스..

[메이플 캘린더] 다크 모드에 대응해보자

사용 의도 사실 필요한 건 아니었지만 그냥 다크 모드를 대응하기 위해 어떤 것이 필요한지를 공부하고 싶어서 다크 모드를 적용시켜보았다. 학습 내용 공식 문서에 따르면 다크 테마는 API 29 이상(안드로이드 10) 이상에서 제공되며, 다음과 같은 여러 가지 장점이 있다고 한다. 전력 사용량을 상당히 절약할 수 있음(기기 화면 기술에 따라 다름) 시력이 낮은 사용자와 밝은 빛에 민감한 사용자를 위한 가시성 개선 누구나 어두운 환경에서 쉽게 기기 사용 가능 안드로이드 10 이상에서 다크 테마를 활성화하는 방법은 3가지가 존재한다. 시스템 설정(설정 → 디스플레이 → 테마)을 사용하여 어두운 테마 활성화 빠른 설정 타일을 사용하여 알림 표시줄에서 테마 전환(활성화된 경우) Pixel 기기에서 절전 모드를 선택..

[메이플 캘린더] AlarmManager로 메붕이들에게 오늘 끝나는 이벤트가 있음을 알려주자

사용 의도 금일 종료되는 메이플스토리의 이벤트가 존재함을 메붕이들에게 알려주기 위하여, AlarmManager를 이용하여 Notification을 보내기로 하였다. 또한 부캠에서 그룹프로젝트를 할 때, Push Notification을 보내는 기능을 구현하는 것을 기획했는데 결국 구현까지 하지는 못 했어서, 부캠 끝나고 한 번 공부해보기로 하였다. 학습 내용 setRepeating() 앱이 백그라운드 상태일 때나, 꺼져있는 상태일 때에도 알림을 받기 위해서 AlarmManager를 사용하기로 하였다. 매일 00시가 딱 경과할 때마다 알림을 보낸다. 따라서 반복적인 알림을 예약해야 하는데, AlarmManager에서 setRepeating() 메소드가 반복 알람을 지원한다. 하지만 setRepeating(..