개인 프로젝트 23

[메이플 캘린더] 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(..

[메이플 캘린더] 메이플 캘린더라는 앱을 만들어보았다! 그런데...?

구글 플레이스토어 개발자 계정에 대한 요구사항 개정 2023년 11월 13일에 구글 플레이스토어 개발자 계정의 앱 테스트에 대한 요구사항이 개정되었다. 근데 왜 두 달이나 지난 지금 뒷북을 치냐면 한창 부스트캠프 멤버십 그룹 프로젝트를 하고 있었기 때문에 확인하지 못 해서 이번 달에 알았다... 부스트캠프 멤버십 과정이 12월 15일에 종료되었는데, 사실 6주간의 그룹 프로젝트가 재미있었고 수료 이후에도 그룹 프로젝트를 계속 이어나갈 의향은 있었는데, 그냥 없던 일이 되었다... 하지만 안드로이드 개발자로 취업하고 싶어서 공부를 계속 하고자 일주일 간 쉬고 크리스마스 이후인 26일부터 혼자서 간단한 앱 개발을 하고자 하였는데, 메붕이로서 평소에 메이플 내에 이벤트가 너무 많아 언제 이벤트가 끝나는 지 일..

[개인 프로젝트] 설빙 레시피 앱 #3

요약 1. 메뉴 선택 화면 수정 본문 1. 메뉴 선택 화면 수정 ImageButton에 사용될 이미지를 버튼 스타일로 바꾸고 스크롤 내리는거를 최소화하기 위하여 해상도도 줄였다. 실행 화면 레시피는 공개할 수 없어서 못 들어간 건데 특정 메뉴의 버튼을 누르면 레시피를 알려주는 화면으로 이동한다. 다음 할 일 은 없고, 사용기한표는 친구가 그냥 하지 말자고 해서 안 했다. 설빙 레시피 앱은 여기까지 끝 GitHub https://github.com/littlesam95/Sulbingrecipe GitHub - littlesam95/Sulbingrecipe: Sulbing Recipe Sulbing Recipe. Contribute to littlesam95/Sulbingrecipe development b..

[개인 프로젝트] 설빙 레시피 앱 #2

요약 1. 설빙, 디저트, 음료의 모든 메뉴 및 레시피 정보를 이미지화 2. 스크롤을 내려서 메뉴를 볼 때, 스크롤의 버벅임이 심하다는 문제 해결 3. .gitignore를 사용하여 레시피 정보가 담긴 이미지들은 GitHub에 Push되지 않도록 수정 본문 1. 레시피 정보 이미지화 메뉴도 많고 레시피도 많은데, 그대로 퍼와서 담기에는 불성실해보이기도 하고, 깔끔하지도 않아서 새로 제작하였다. 그래서 시간이 좀 걸렸다. 다만 아쉽게도 레시피의 내용은 보여줄 수 없기 때문에 글로만 작성한다. 2. 스크롤 버벅임 문제 해결 1. Recyclerview 사용 LinearLayout을 사용하여 모든 메뉴를 일일히 나열했기 때문에 스크롤 버벅임이 심하다고 생각했고, 따라서 Recyclerview를 사용하기로 하였..

[개인 프로젝트] 설빙 레시피 앱 #1

요약 1. MainActivity에서 로고 및 설빙, 디저트, 음료, 사용기한표 버튼 구현 2. SulbingActivity에서 모든 빙수 레시피를 볼 수 있는 버튼 구현 3. SulbingrecipeActivity에서 해당 빙수를 제조하는 데 필요한 재료와 레시피 구현 본문 1. MainActivity 작업 친구가 갈색 계통으로 하면 좋겠다고 생각하여, 갈색 계통으로 로고와 버튼을 칠하였다. 그리고 배경은 친구가 실제 일하는 매장을 사진으로 찍은 것이다. activity_main.xml MainActivity.kt package com.bodan.sulbingrecipe import androidx.appcompat.app.AppCompatActivity import android.content.Int..

[개인 프로젝트] 메이플 브금 맞추기 앱 #8

요약 1. FinishActivity의 다시 버튼을 누르면 메인 화면(MainActivity)으로 돌아가게 하였음. 2. 게임 화면(PlayActivity), 결과 화면(FinishActivity)에서는 뒤로 가기 버튼이 작동이 안 되게 하였음. 3. 제작자 블로그 버튼을 만들어 이 블로그에 쓰여져 있는 후기글로 갈 수 있도록 하였다.(절대 방문수 빨아먹으려고 만들어둔 게 아니다.) 본문 1. FinishActivity의 다시 버튼 구현 다시 버튼을 구현하여, MainActivity로 이동하도록 하였다. binding.returnButton.setOnClickListener { val intent = Intent(this@FinishActivity, MainActivity::class.java) inte..

[메이플 브금 맞추기] BGM 목록

1. 로그인/타이틀 2. 리스항구 3. 헤네시스필드/골렘의사원/헤네시스북쪽언덕 4. 엘리니아 5. 페리온 6. 커닝시티 7. 헤네시스 8. 오르비스 9. 엘나스 10. 루디브리엄 11. 아리안트 12. 마가티아 13. 에레브 14. 에레브연무장/연무장 15. 노틸러스선착장 16. 노틸러스 17. 슬리피우드 18. 엘리니아나무던전/나무던전 19. 엘리니아필드/솟아오른나무 20. 커닝시티늪지대/늪지대/방황의늪/위험한크로코 21. 불타버린땅 22. 비화원 23. 개미굴 24. 커닝시티지하철/지하철 25. 블러디퀸/블퀸 26. 피에르/삐에로 27. 반반 28. 벨룸 29. 에레브수련의숲/수련의숲 30. 리엔 31. 뒤틀린시간의길1,2 32. 뒤틀린시간의길3,4 33. 잊혀진시간의길1,2 34. 잊혀진시간의길3,..

[메이플 브금 맞추기] 게임 하는 법

안녕하세요 게임 다 끝나고 나서 뭐하는 놈인데 이따구로 만들었지? 하고 들어오신 분들 반갑습니다. 우선 닉네임 만들기는 사실 없어도 되는데, 일단 그냥 넣었습니다. 서버 구축하는 방법을 몰라서 네트워크 플레이가 불가능한데 나중에 만들수도 있어서 그랬습니다. 정답을 입력할 때에는 브금이 사용되는 대표적인 마을이나 지역 이름(예: 헤네시스, 커닝시티)이나 브금의 원제목(예: Floral Life, Bad Guys)를 입력하면 통과됩니다. 그리고 마을이나 지역 이름을 작성할 때는 띄어쓰기를 하시면 안되고, 흔히 통용되는 약어를 입력하셔도 통과됩니다.(예: 그림자가 춤추는 곳(O), 그춤(O)) 그래도 모르겠다! 하시는 분은 아래에 브금 목록을 올려둔 글 링크를 올리겠습니다. 그리고 건설적인 피드백은 무조건 환..