안드로이드 컴포즈에서 Text의 Font 사이즈를 지정하는 방법입니다.보통 Text Size는 시스템 폰트 사이즈를 따라가는 SP 단위를 사용하지만 혹시 자신의 서비스가 인앱에서 텍스트 사이즈 메뉴를 제공한다면 DP를 사용하는 것처럼 고정해 줄 필요가 있습니다.먼저 해상도별 적절한 크기를 가질 수 있도록 아래 함수를 활용해줍니다.@Composablefun dpToSp(dp: Dp) = with(LocalDensity.current) { dp.toSp() }@Composable: 이 함수는 Compose 환경에서 호출될 수 있는 함수임을 나타내는 어노테이션입니다.dp: Dp: 함수의 인자로 Dp 값을 받습니다. Dp는 화면 밀도에 독립적인 픽셀 단위로, 화면 크기나 해상도에 따라 크기가 변하지 않는 단위입..
Development

TopAppBar는 Android UI에서 상단에 위치하는 앱 바(app bar)를 구현하는 컴포넌트입니다. 이 컴포넌트는 애플리케이션의 타이틀, 내비게이션 아이콘, 작업 메뉴 등을 표시하는 데 사용됩니다. 기본적으로 Top App Bar로 title과 navigation Icon을 구성하면 다음과 같이 나타납니다.타이틀이 왼쪽에 위치해 있는 것을 확인하실 수 있습니다.하지만 디자인 기획에 따라 오른쪽 또는 중앙에 배치할 수 있겠죠. 단순하게 처리한다면, 최대 너비에 맞춘 Row 컴포저블과 그 내부에 Title을 구성함으로써 위치를 조정할 수 있습니다.Row( modifier = Modifier.fillMaxWidth(), // `Row`를 화면 너비에 맞춤 horizontalArrangeme..
이미지 로딩 라이브러리에는 다양한 종류가 있습니다. Picasso, Glide, Coil.. 대표적으로 이 3가지가 많이 사용됩니다.Coil 특징 몇 가지를 정리해 보자면1. 주로 사용되는 3가지 라이브러리 중 이미지 로딩 속도가 가장 빠릅니다.2. Coroutine 기반으로 비동기 이미지 로딩을 처리합니다. 메모리 성능이 향상되고 누수 확률도 줄어듭니다.3. Glide보다 속도가 빠르면서도 Glide를 많이 참조했기 때문에 캐싱, 오류 처리, 이미지 변환 등의 기능 제공에도 문제가 없습니다. 오늘은 간단하게 라이브러리 추가 및 컴포즈에서 이미지를 로딩하는 방법까지 확인해 보겠습니다.먼저 Gradle에 의존성 추가를 진행합니다. implementation "io.coil-kt:coil-compose:2...
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" } (#는 해당 위치에 숫자가 없으면 아무것도 표시하지 않지만, ..