๐ฉโโ๏ธ ๊ฐํธ์ฌ, ๊ฐํธ์ ๊ณตํ์๋ค์ ์ํ ์ปค๋ฎค๋ํฐ ์ดํ๋ฆฌ์ผ์ด์
๐จโโ๏ธ
[Android] ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ ๋ฐ ๋ด๋ถํ
์คํธ v1.0.1-beta๊น์ง ๊ตฌํํ ๋ด์ฉ
๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์
๋ก๊ทธ์ธ |
์๋ ๋ก๊ทธ์ธ |
ํ์๊ฐ์
|
![-์คํ๋์๋ฐ๋ก๊ทธ์ธ](https://user-images.githubusercontent.com/57751515/145573892-727d1e85-a2dc-492e-8f8d-ced78ce7dc29.gif) |
![์๋๋ก๊ทธ์ธ](https://user-images.githubusercontent.com/57751515/145573911-d1e29bbe-2641-4d0c-ab80-ddc4b07e821e.gif) |
![ํ์๊ฐ์](https://user-images.githubusercontent.com/57751515/145573973-fa44ce98-55b7-4be3-9340-d9c56ec42997.gif) |
- Retorofit2๋ฅผ ์ด์ฉํ ์๋ฒ ํต์ ์ผ๋ก ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๊ตฌํ
- Coroutine, LiveData, Flow๋ฅผ ์ด์ฉํ ๋ฐ์ํ UI
- Shared Preferences๋ก ํค-๊ฐ ํํ๋ก Bearer token์ ์ ์ฅํด ์๋ ๋ก๊ทธ์ธ
4๊ฐ์ ๋ค๋น๊ฒ์ด์
ํญ
![](https://user-images.githubusercontent.com/57751515/145574417-211e9d17-91e9-4ee9-b8db-73571c685e09.gif)
- Navigation์ ํตํด ๋ฐํ
๋ค๋น๊ฒ์ด์
๋ทฐ๋ฅผ ์ด์ฉํ ํ๋๊ทธ๋จผํธ ์ ํ ๊ฐ๋ฅ
- ๋ฉ์ธ ํ๋ฉด๊ณผ ์บ๋ฆฐ๋ ํ๋ฉด์ ๊ธฐ๋ฅ๊ณผ ๋์์ธ์ ๋ณด์ํด ์ถํ ์
๋ฐ์ดํธ ์์
- ํ๊ฒฝ์ค์ ํญ๋ ๋ก๊ทธ์์ ์ธ์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ์
๋ฐ์ดํธ ์์
๊ฒ์ํ ๋ฐ ๊ฒ์๊ธ ์์ฑ / ์ญ์ ๋ฑ์ ํ๋
๊ฒ์ํ |
๊ฒ์๊ธ ์์ฑ |
๊ฒ์๊ธ ์ญ์ |
![๊ฒ์๊ธ๋ฆฌ์คํธ](https://user-images.githubusercontent.com/57751515/145574890-4f4e90c8-c44f-48ee-8a38-ab511b8f3fbd.gif) |
![๊ธ์ฐ๊ธฐ](https://user-images.githubusercontent.com/57751515/145574902-e4e7e044-f975-4550-8204-68c146a08ea0.gif) |
![๋ด๊ฒ์๊ธ๊ฒฝ์ฐ](https://user-images.githubusercontent.com/57751515/145670444-89b91353-d576-44cf-8172-7a4132c1ce26.gif) |
- SwipeRefreshLayout์ ํตํด swipe์ ์๋ฒ์์ ์ต์ ๋ฆฌ์คํธ๋ฅผ ์๋ก ๋ถ๋ฌ์ ์ถ๋ ฅ
- ๋ฌดํ ์คํฌ๋กค -> ์คํฌ๋กค์ด ์ตํ๋จ์ ๋๋ฌํ๋ฉด ๋ถ๋ฌ์จ ๋ง์ง๋ง ๊ฒ์๊ธ ์์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ ์ดํ์ ๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐ๋ก ๋ถ๋ฌ์ด
- ์๋ฒ์์ ํต์ ์ฑ๊ณต ์๋ต์ ๋ฐ๊ธฐ ์ ๊น์ง ProgressBar๋ฅผ ํฌํจํ ๋ ์ด์์์ includeํ๊ฑฐ๋ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋์ ๋ก๋ฉ ํ๋ฉด ๊ตฌํ
๊ฒ์๊ธ ๊ณต๊ฐ / ์คํฌ๋ฉ / ์ ๊ณ ๋ฐ ๋๊ธ
๊ฒ์ํ ์ข์์ / ์คํฌ๋ฉ / ์ ๊ณ |
๋๊ธ ์์ฑ ๋ฐ ์ญ์ / ์ข์์ |
![๊ฒ์๊ธ๊ณต๊ฐ์คํฌ๋ฉ์ ๊ณ](https://user-images.githubusercontent.com/57751515/145670440-06045d13-441f-47bb-bffa-d9302c5749fa.gif) |
![๋๊ธ์คํฌ๋กค๋ฐ์ข์์์ ๊ณ](https://user-images.githubusercontent.com/57751515/145670627-a6b0d7b0-d87d-4101-bd3f-b7076efdd7a5.gif) |
- ๊ฒ์๊ธ ๋๋ ๋๊ธ ์ข์์ ์ ํ๋ฉด ๋ด ์ข์์ ์ซ์ + 1
- ํ๋ฉด ์คํฌ๋กค ์กฐ์
object ScrollViewUtils {
// ํด๋น ๋ทฐ๊น์ง ์คํฌ๋กค์ ๋ถ๋๋ฝ๊ฒ ์ด๋
fun NestedScrollView.smoothScrollToView(view: View, marginTop: Int = 0) {
val y = calculateDistance(view) - marginTop
ObjectAnimator.ofInt(this, "scrollY", y).apply {
duration = 1000L
}.start()
}
// ์คํฌ๋กค๋ทฐ์ ํด๋น ๋ทฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
private fun NestedScrollView.calculateDistance(view: View): Int {
return kotlin.math.abs(
calculateView(this).top - (this.scrollY + calculateView(
view
).top)
)
}
// ์คํฌ๋ฆฐ ๋ด์ ๋ทฐ ์ ๋ ์ขํ ๊ณ์ฐ
private fun calculateView(view: View): Rect {
val location = IntArray(2)
view.getLocationOnScreen(location)
return Rect(
location[0],
location[1],
location[0] + view.measuredWidth,
location[1] + view.measuredHeight
)
}
}
- ์คํฌ๋กค ์ด๋ ์์๋ ๋ณด์ด๊ฒ ํ๊ณ ์ถ์ ๋๊ธ ๋ทฐ ์์น๋ฅผ ๊ณ์ฐํด ์ ์ ํ ์์น๋ก 1์ด ๋์ ๋ถ๋๋ฝ๊ฒ ์ด๋
- ์๋ก์ด ๋๊ธ ์์ฑ ์ ํ๋ฉด ๋งจ ํ๋จ์ผ๋ก ์คํฌ๋กค ์ด๋
- ๋๋๊ธ์ ๋ฌ๊ธฐ ์ํ ๋๊ธ ์ ํ ์ ์ ํํ ๋๊ธ์ด ํค๋ณด๋ ์๋ก ๋ณด์ด๋๋ก ์คํฌ๋กค ์ด๋
- ์๋ก์ด ๋๋๊ธ ์์ฑ ์ ํด๋น ๋๋๊ธ์ด ํ๋ฉด์ ๋ณด์ด๋๋ก ์คํฌ๋กค ์ด๋
๊ฒ์๊ธ ๊ฒ์ ๋ฐ ์ด๋ฏธ์ง ์๋ณธ ๋ณด๊ธฐ
๊ฒ์๊ธ ๊ฒ์ |
์ด๋ฏธ์ง ์๋ณธ ๋ณด๊ธฐ |
![๊ฒ์๊ธ ๊ฒ์](https://user-images.githubusercontent.com/57751515/152991035-7497ccfd-f27a-4757-8bab-daa3fcc2cfe7.gif) |
![์ด๋ฏธ์ง ์๋ณธ ๋ณด๊ธฐ](https://user-images.githubusercontent.com/57751515/152997533-1e51372a-a363-4657-8601-8613ff8a75db.gif) |
- Coroutine๊ณผ Job์ ์ด์ฉํด EditTex์ ์ค์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์งํ์ฌ ๊ฒ์ํ๋ Instant Search ๊ตฌํ
- ๋ชจ๋ ์ฟผ๋ฆฌ์ ๋ณํ๋ฅผ ๊ฐ์งํด call์ ๋ณด๋ด๊ณ return์ ๋ฐ์ผ๋ฉด ๋์์ด ๋ฌด๊ฑฐ์์ง๊ณ ์ ํํ ์ฟผ๋ฆฌ ๊ฒ์์ด ์ด๋ฃจ์ด์ง์ง ์์ ์ ์์ด์ rxJava์ debounce์ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋๋ก 0.5์ด ๋๋ ์ด๋ฅผ ์ฃผ์ด ๋์ ์ํ
- ViewPager2๋ฅผ ์ด์ฉํด ๊ฒ์๊ธ ์ด๋ฏธ์ง์ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ผ์ด๋ ํํ๋ก ์กฐํ ๊ตฌํ
์ฌ์ฉ์ ๊ฒ์๊ธ ํ๋
![](https://user-images.githubusercontent.com/57751515/145671445-d73b7773-a174-4c54-bbe4-b9c157769e54.gif)
- ๋ด๊ฐ ์ด ๊ธ / ๋๊ธ ๋จ๊ธด ๊ธ / ์คํฌ๋ฉํ ๊ธ ํ์ธ ๊ฐ๋ฅ
ํ๊ฒฝ์ค์ - ๋ก๊ทธ์์
![](https://user-images.githubusercontent.com/57751515/145671525-50078bad-d1f5-4ef1-b5d0-e6cb239e8afb.gif)
- ํ๊ฒฝ์ค์ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ถ๊ฐ ๊ตฌํ ์์
+) ์บ๋ฆฐ๋ (๋์์ธ ์์ ํ์)
์ค์ผ์ค ์กฐํ |
๊ทผ๋ฌด ํ์
์ถ๊ฐ |
์ค์ผ์ค ํธ์ง ๋ชจ๋ |
![์บ๋ฆฐ๋ ์กฐํ](https://user-images.githubusercontent.com/57751515/135029443-f2cf2bd8-a6fe-4a5e-88b6-f32492813743.png) |
![๊ทผ๋ฌด ํ์
์ถ๊ฐ](https://user-images.githubusercontent.com/57751515/135030945-7a1771d4-40b0-40fa-9a70-17a709c7925a.gif) |
![์ค์ผ์ค ํธ์ง ๋ชจ๋](https://user-images.githubusercontent.com/57751515/135030150-b1be08c6-d9f0-4af2-848c-77db52cf4b33.gif) |
- Realm์ ์ฌ์ฉํด ๋ก์ปฌ DB ๊ตฌ์ฑ
- CalendarViewPager๋ก ์บ๋ฆฐ๋ ํ๋ฉด ๊ตฌ์ฑ
- ๊ทผ๋ฌด ํ์
์ถ๊ฐ ์, ๊ทผ๋ฌด ํ์
ํ์ดํ๊ณผ ์๊ฐ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ฉด DB์ Shift๊ฐ ์ ์ฅ๋๊ณ ๋ฐ๋ก ๋ฆฌ์ฌ์ดํด๋ฌ ๋ทฐ์ ๋ฐ์
- ์ค์ผ์ค ํธ์ง ๋ชจ๋์์๋ ํ๋จ ๊ทผ๋ฌด ํธ์ง ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ํตํด ์ฐ์์ผ๋ก ์ค์ผ์ค ์ถ๊ฐ๊ฐ ๊ฐ๋ฅ
targetSdkVersion 30 / minSdkVersion 21