Android/Android Compose 15

안드로이드 컴포즈 네비게이션 startDestination 에 argument 전달하기

이 글은 컴포즈 네비게이션 2.7 버전을 기준으로 작성됐다. 네비게이션을 쓰다가 startDestination 로 시작하는 화면에서 바로 argument 를 전달하고 싶을수도 있다.처음 시작하는 화면에서 쓰이고 있는 hiltViewModel 에서 SavedStateHandle  에 argument 로 던진 데이터를viewModel 이 시작될때부터 가지고 있어야하는 상황이라던가 그럴때 말이다. 그런데 argument 를  startDestination 경로에 넣으면 SavedStateHandle 에서 값을 가져오질 못한다.정확하게 찾진 못했는데 startDestination 는 정적인 경로만 등록이 가능하다는거 같다. 이때 arguments 를 등록하는 곳에 defaultValue 를 전달하고자 하는 값을..

Compose + AGSL 셰이더를 이용해서 간지나는 카드 애니메이션 만들기

어디선가 카드를 휘리릭 돌리면 카드가 돌아가면서 번쩍거리는 멋진 인터렉션을 본 적이 있는거 같다.셰이더나 애니메이션에 관심이 많아진 요즘 뭐라도 해보고 싶어서 뚝딱 해봤다. 일단 최종결과물부터 봐보자.꽤 멋져.  자자 액티비티부터 만들어준다.class MainActivity : ComponentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        enableEdgeToEdge()        setContent {            MetalCardFilpTheme {                Scaffold(modifier = Modifier...

안드로이드 compose 비트맵으로 캡쳐하기

를 만들려고 하루종일 삽질을 했다...결국 만드는건 포기했는데관련해서 괜찮은 라이브러리를 찾아서 소개한다.https://github.com/PatilShreyas/Capturable GitHub - PatilShreyas/Capturable: 🚀Jetpack Compose utility library for capturing Composable content and transforming it into🚀Jetpack Compose utility library for capturing Composable content and transforming it into Bitmap Image🖼️ - PatilShreyas/Capturablegithub.com어떻게 만들었다 들여다봐야지 ㅠㅠ..

Android Compose 의 @Immutable 와 @Stable

Jetpack Compose에서 @Immutable와 @Stable 어노테이션은 컴포저블 함수의 리컴포지션을 최적화하는 데 중요한 역할을 합니다. 각각의 어노테이션은 특정한 상황에서 사용되며, 사용하는 것과 사용하지 않는 것에 따라 성능에 미치는 영향이 달라집니다.1. @Immutable@Immutable 어노테이션은 클래스가 불변(immutable)임을 명시합니다. 불변 객체는 상태가 변경되지 않기 때문에, Jetpack Compose는 해당 객체가 변경되지 않는다고 가정하고 리컴포지션을 피할 수 있습니다.언제 사용할까?@Immutable은 객체가 불변이며, 내부의 모든 필드도 불변 객체일 때 사용합니다. 이는 데이터 클래스와 같은 경우에 자주 사용됩니다.예시:@Immutable data class U..

컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 2

2024.04.21 - [Android/Android Compose] - 컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1 컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1컴포즈에는 side effect 라는 개념이 존재한다. 단어의 원래 뜻은 부작용이라는 뜻인데 왜 이런 명칭을 붙였는지 의아하긴 했는데 찾아보니 composable 은 단방향으로 state 를 전달하는게 기본인데 전choi-dev.tistory.com이전 글에 이어서 알아보자. 이번에는 DisposableEffect SideEffect 이렇게 알아볼 예정이다. DisposableEffect  는 앞글에서 봤던 LaunchedEffect 와 비슷하지만 취소됐을때 onDispose 가 호출된다.취소될때의 동작을 추가..

컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1

컴포즈에는 side effect 라는 개념이 존재한다. 단어의 원래 뜻은 부작용이라는 뜻인데 왜 이런 명칭을 붙였는지 의아하긴 했는데 찾아보니 composable 은 단방향으로 state 를 전달하는게 기본인데 전달되는 방향 반대로 상태를 변경해야하는 상황도 지원하기 위해 side effect 라는 개념을 도입했기 때문에 이런 이름이 붙었다고 한다. 요약을 해보자면 side effect 는 Composable 에서 자신이 아닌 외부의 상태에 영향을 발생시키는 것이겠다. 보통 flow 를 사용해서 특정 이벤트를 collect 하면 외부의 상태를 변경하는 경우가 일반적인 예라고 할 수 있겠다. Side Effect 를 지원하기 위한 다양한 API LaunchedEffect rememberCoroutineSc..

Jetpack Compose CompositionLocal 에 대해 알아봅시다

컴포즈를 사용하다보면 종종 CompositionLocal 을 마주치곤 한다. 테마를 커스텀하고 싶을때 사용하곤 했는데 CompositionLocal 은 어떻게 동작하길래 테마 커스텀에서 사용됐는지 개념을 알아보자. CompositionLocal 이 필요한 이유 컴포저블 함수들은 트리형태로 구성된다. 그래서 상태의 관리를 편하게 하기 위해서 보통 상태 호이스팅이라는 개념으로 상위 노드에서 관리하고 하위 노드로 전파한다. 그런데 극단적으로 트리의 깊이가 100개면 어떨까. 이 상태를 아래까지 다 전파하는건 쉽지 않을거다. 이때 CompositionLocal을 유용하게 써먹을 수 있는데 너무 대충 그렸지만 아래 같은 느낌으로 컴포지션로컬의 영역에 있는 컴포저블끼리는 하위에서 상위 노드의 상태에 접근하도록 제공..

스와이프 삭제 구현

이미 쓴 글이 있지만 솔직히 너무 별로라서 새로 만들어봤다. (솔직히 내가 만들어놓고도 이건 좀.. 하고 있었음) 2024.01.14 - [Android/Android Compose] - [안드로이드 컴포즈] 스와이프 삭제 구현 핵심 키워드는 DraggableAnchors, AnchoredDraggableState 이고 구현에 관심이 있다면 위 검색어로 찾아보면 훨씬 쉽고 자연스럽게 뚝딱하고 만들 수 있다. @OptIn(ExperimentalFoundationApi::class) @Composable fun SwipeScreen( contentComposable: @Composable () -> Unit, buttonComposable: @Composable () -> Unit, buttonModifie..

[안드로이드 컴포즈] 스와이프 삭제 구현

안드로이드 컴포즈에는 SwipeToDismiss 라는게 이미 만들어져 있다. 레이아웃을 옆으로 밀면 밀어낸 반대 방향에 버튼이 생기는 레이아웃 같은걸 만들때 쓴다. 하지만? 나는 또 다른 디자인으로 만들고 싶었다. 찾아보면 이걸 사용해서도 방법은 있겠지만 그냥 내가 생각나는대로 만드는게 빠를거 같아서 만들어봤다. 혹시나 구글이 준비해준 SwipeToDismiss 가 맘에 안드는 사람들에게 귀찮음을 덜어줄 수 있었으면 한다. 만드려는 레이아웃은 이렇다. 순서는 아래와 같다. 1. 스와이프 했음을 인지하는 방법 2. 스와이프한 값을 이용해서 컴포넌트를 스와이프 한 방향으로 옮기는 방법 3. 삭제 버튼을 나오게 하는 방법 @OptIn(ExperimentalMaterial3Api::class) @Composab..

안드로이드 컴포즈 dialog 커스텀 하기

안드로이드 컴포즈에서 제공하는 AlertDialog 를 사용하면 간단하게 뚝딱 dialog 를 만들 수 있지만 정해진 틀에 맞춰서 사용해야하는 문제가 있다. 나는 역시나 고집을 부려서 커스텀을 하고 싶었는데 어떻게 만들었는지 간단히 정리하려한다. 먼저 Dialog의 기본 형태를 잡아보자. 아래 코드를 살펴보자. @Composable fun DialogComponent( onDismissRequest: () -> Unit, visible: Boolean, height : Dp, content: @Composable () -> Unit ) { if (visible) { //커스텀하려면 AlertDialog 말고 Dialog를 써준다. Dialog( onDismissRequest = { onDismissReq..