이미지 로딩 라이브러리에는 다양한 종류가 있습니다. Picasso, Glide, Coil.. 대표적으로 이 3가지가 많이 사용됩니다.Coil 특징 몇 가지를 정리해 보자면1. 주로 사용되는 3가지 라이브러리 중 이미지 로딩 속도가 가장 빠릅니다.2. Coroutine 기반으로 비동기 이미지 로딩을 처리합니다. 메모리 성능이 향상되고 누수 확률도 줄어듭니다.3. Glide보다 속도가 빠르면서도 Glide를 많이 참조했기 때문에 캐싱, 오류 처리, 이미지 변환 등의 기능 제공에도 문제가 없습니다. 오늘은 간단하게 라이브러리 추가 및 컴포즈에서 이미지를 로딩하는 방법까지 확인해 보겠습니다.먼저 Gradle에 의존성 추가를 진행합니다. implementation "io.coil-kt:coil-compose:2...
Development/Android
API 통신 로직을 구성하다 보면 경우에 따라 다른 형식으로 내려오는 Attributes 필드가 존재하는 경우가 있습니다.유연하게 수신받아 처리하기 위해서 Retrofit에 리플렉션 처리를 추가하는 방법도 있겠지만 단순하게 Any Type Value를 가지는 Map을 데이터 클래스로 반환하는 방법에 대해 알아보겠습니다.data class Result( val isSuccess: Boolean, val data: HashMap)위와 같이 Response 데이터 클래스를 지정했다면 어떤 타입 스타일이 들어올지 모르지만 어차피 수신되는 데이터의 기본 형태는 형태이므로 Map을 지정해 줍니다.그리고 로직에서 필요한 Attributes의 스타일들을 데이터 클래스로 구성합니다.data class Att..
안드로이드 컴포즈에서 Tab Bar를 구현하기 위해 고정 TabRow 또는 Scrollable TabRow가 사용됩니다.아주 기본적인 탭을 구성하기에는 빠르게 적용가능한 컴포저블입니다. 하지만, 원하는 스타일에 알맞은 커스터마이징 작업을 진행하기에는 제한적인 부분들이 있습니다.아래 기존의 Scrollable TabRow 코드를 확인해 보겠습니다.(탭의 width를 확장성 있게 가져가기 위해서 Scrollable TabRow를 선호합니다.)@Composablefun ScrollableTabRow( selectedTabIndex: Int, modifier: Modifier = Modifier, containerColor: Color = TabRowDefaults.primaryContainer..
리스트나 화면을 구성하는 동안의 Loading 상태에서 자주 사용되는 Shimmer View. 기존 XML 방식에서는 각종 라이브러리를 활용하여 많이 구현되었습니다.하지만 Compose에서는 아직 직접 구현이 필요한 듯하여 다른 분들의 코드를 참고하여 구현을 진행했습니다.먼저 위 이미지와 동일한 형태의 컴포저블을 구현해야합니다.스켈레톤 효과를 입혀줄 틀을 만들어주는 것입니다. @Composable fun PlaceholderItem() { Row( modifier = Modifier .fillMaxWidth() .padding(16.dp) .height(72.dp) ) ..
Dialog에서 기존 XML 기반 View에 ComposeView를 병합하는 작업을 진행하던 중에 아래와 같은 오류를 마주쳤습니다.java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from android.widget.FrameLayout{854b4dc V.E...... ......I. 0,0-0,0 #7f0a0897 app:id/rootLy} at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareWindowRecomposer(WindowRecomposer.android.kt:352) at androidx.compose.ui.platform.Window..

안드로이드에서 Balloon 툴팁 구현하실 때, 아마 알고 계신 분들도 많겠지만 해당 라이브러리를 사용하는 경우가 많습니다.https://github.com/skydoves/Balloon GitHub - skydoves/Balloon: :balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for:balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. - skydoves/Balloongithub.com 기존 View 방식이나 Compose 방식을 모두..

안드로이드에서 mp4 형식의 사용 방법 가이드 영상 파일을 넣어야 하는 작업이 생겼습니다.새로운 화면을 만드는 겸 Compose를 기반으로 mp4 영상을 넣어봤네요. ExoPlayer라는 오픈 소스 미디어 플레이어 라이브러리를 활용했습니다.https://developer.android.com/media/media3/exoplayer/hello-world?hl=ko 시작하기 | Android media | Android Developers이 페이지는 Cloud Translation API를 통해 번역되었습니다. 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 도움말: 시작하는 또 다른 방법은 ExoPlayer Codedeveloper.android.com 먼저..
소수점 반올림 처리 표시에 사용되는 DecimalFormat import java.text.DecimalFormat import java.math.RoundingMode fun main() { val a = 13 val b = 0.165 val decimalFormat = DecimalFormat("0.000000") // 소수점 아래 6자리까지, 부족한 부분은 0으로 채움 decimalFormat.roundingMode = RoundingMode.DOWN val res = decimalFormat.format(a * b) println("FormatDouble -> $res") // 출력: "FormatDouble -> 2.145000" } (#는 해당 위치에 숫자가 없으면 아무것도 표시하지 않지만, ..
데이터 필터링 작업을 하던 중에 조금 특수한 케이스를 처리해야 하는 상황이 생겨 몇 가지 컬렉션 함수를 실무에서 사용했습니다. 어떤 boolean 값으로 구분이 가능한 데이터 리스트가 존재하고, 이 중 false인 부분을 다시 특정 날짜값에 의해 그룹화하여 어떤 필드의 최대 값을 가지고 있는 요소만 살리도록 하는.. 그런 로직이 필요했습니다. 일단 먼저 boolean 값 구분을 위해 partition 함수를 사용했습니다. 명시한 조건에 따라 리스트를 분리해 줍니다. 저는 true/false 조건이기 때문에 변수 2가지로 리스트를 구분할 수 있었습니다. val (fineDatas, nonFineDatas) = allDatas.partition { it.isFine() } 다음으로 nonFineDatas를 ..

안드로이드의 Toast는 기본적으로 텍스트 메시지를 위한 것이며, 사용자 인터랙션(예: 버튼 클릭)을 직접 처리하는 기능을 내장하고 있지 않습니다. 따라서 커스텀 Toast로 버튼을 삽입한다고 하더라도 onClick에 대한 처리가 불가능합니다. 그래도 Toast에 Clickable을 추가하고 싶다면? Custom Dialog를 활용하여 어느 정도 비~슷하게 구현이 가능합니다. 우선 위와 같은 형태로 Custom Dialog 레이아웃 XML 파일을 구성했습니다. 그다음, ClickableToast라는 이름으로 Custom Dialog를 생성합니다. class ClickableToast(private val context: Context, private val text: String) : Dialog(con..