compose

- Compose에서는 이미 렌더링 된 UI를 갱신하기 위해 상태 변경이 일어날 때마다 필요한 부분들을 다시 그리는 Recomposition이라는 메커니즘을 사용한다. - 리컴포지션은 상세하게 Composition -> Layout -> Drawing 세 가지 단계를 거친다. - 리컴포지션이 발생하면 Compose는 Composition 단계부터 새롭게 시작하며, 여기서 컴포저블 노드는 UI 변경 사항을 Compose Runtime에 알리고, 업데이트된 UI가 최신 상태를 반영하도록 보장한다. - 리컴포지션이 발생하는 조건은 다음과 같다.1. 매개변수에 변경이 발생했을 때2. 상태 변경이 관찰되었을 때 - Composition의 주요 작업• @Composable 함수 실행• UI 트리 생성 및 업데이트..
- Jetpack Compose는 개발자가 상태 변경 시 UI를 어떻게 업데이트할지를 나타내는 것이 아닌, 특정 상태에서 UI가 어떻게 보여야 하는지를 설명하는 선언적 UI 프레임워크의 특성을 가지고 있다. - 이는 개발자가 뷰를 데이터의 변화에 따라 수동으로 업데이트해야 하는 명령형 접근 방식과는 차이가 있는 것이다. - 예를 들어 서버로부터 어떤 데이터가 내려왔고, 그 데이터를 UI에 반영해 주려면 UI 레벨에서는 API 호출이 완료된 시점을 체크하여 refresh() 함수를 구현해서 재호출 해야 할 수 있다. - 하지만 Compose의 경우에는 데이터 자체를 State로 관찰하여 즉시 시스템이 UI에 반영할 수 있도록 한다. 선언형 UI 특징- 상태 주도 UI : 시스템은 각 컴포넌트의 상태를 추적..
- API 호출을 통해 리스트 화면을 갱신하는 구조의 MainActivity가 있는데, 수동 동기화 버튼이 존재하지만 사용자에게 더 편리함을 주기 위해 다른 앱에 있다가 다시 해당 앱으로 복귀하면 자동으로 동기화해주는 기능이 필요했다. - 아래와 같은 Compose 기반의 화면으로 구성되어 있었고, 갱신 시 viewModel에서 새로운 값을 가져온다.@AndroidEntryPointclass MainActivity : ComponentActivity() { private val stationViewModel: StationViewModel by viewModels() private val subwayArrivalViewModel: SubwayArrivalDataViewModel by viewM..
- 안드로이드에는 위젯 인스턴스 하나마다 고유한 ID를 가진다. 이게 AppWidgetId이다. - 바탕화면에 똑같은 위젯 두 개를 생성해도 개별 ID는 다르다. 이를 통해 서로 바라보는 데이터를 달리할 수 있다. - 예를 들어 A-1 위젯에서는 Key + A-1-AppWidgetId로 1번 데이터를, A-2 위젯에서는 Key + A-2-AppWidgetId로 2번 데이터를 저장하고 렌더링 할 수도 있는 것이다. - 기존 XML RemoteViews 방식 위젯에서는 아래와 같이 AppWidgetId 조회가 가능하다.override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntAr..
- Glance에서 Image 컴포저블 자체에 Alpha 값을 적용할 수는 없다. 그래서 애초에 ImageProvider에 리소스를 넘길 때 알파 값이 적용된 리소스여야 한다. - 알파값 적용된 비트맵은 아래 확장함수를 구현하여 기존 비트맵에서 알파를 적용한 비트맵을 다시 그리도록 했다.fun Bitmap.withAlpha(alpha: Float): Bitmap { val result = createBitmap(width, height) val canvas = Canvas(result) val paint = Paint().apply { this.alpha = (alpha * 255).toInt() } canvas.drawBitmap(this, 0f, 0f, paint) retu..
- 결제 모듈 라이브러리를 업데이트하라는 알림이 와서 업데이트했더니 코틀린 버전도 2.0으로 업그레이드해야 호환이 된다고 한다. - 그래서 프로젝트 수준 Gradle에 선언해 둔 코틀린 버전을 일단 2.0.0으로 업그레이드했다.buildscript { ext.kotlin_version = '2.0.0' ... - 코틀린 버전 업그레이드에 따라 Compose 컴파일러 버전에 대해서도 변경해주어야 한다.- Compose 컴파일러가 Gradle plugin 방식으로 변경되었다. - 원래는 버전 카탈로그를 통해 다음 링크에 나온 것처럼 업데이트를 할 수 있는데, 현재 프로젝트 상태가 많이 상이하여 임시 대응했다.https://developer.android.com/develop/ui/compose/c..
- 안드로이드 Glance에서 특정 화면을 열거나 로직을 수행하기 위해서는 GlanceModifier.onClick()에 Action을 명시해주어야 한다. - Glance의 Action은 UI 요소에 "동작"을 연결하는 역할을 하는 개념이다.위젯에서 특정 Activity 열기- 먼저 Glance에서 특정 화면을 열기 위해 ActionIntent는 아래와 같이 사용한다.modifier = GlanceModifier .size(20.dp) .clickable(onClick = actionStartActivity( Intent(context, WidgetSettingsActivity::class.java).apply { data = Uri.parse(KEY_WIDGE..
- 위젯을 구현하다 보면 사이즈 별로 다른 레이아웃을 제공하거나 높이 너비에 따라 View의 구성이 달라지는 구현을 필요로 할 때가 있다. - 기존 RemoteViews에서는 AppWidgetInfo에 접근하여 사이즈 값에 대해 확인했으나 Glance에서는 좀 다르다.appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight - SizeMode 라는 값을 통해 위젯 크기 변화에 따른 레이아웃 구성 대응이 가능하다. - SizeMode는 Glance 위젯이 시스템에서 요구하는 사이즈 정보의 유연성을 어떻게 처리할지를 정의한다.sealed interface SizeMode { /** * The [GlanceAppWidget] provides a sing..
- 기존의 RemoteViews XML 기반 위젯에서는 PendingIntent를 통해 Activity를 열었다. - 하지만 Glance에서는 actionStartActivity() 함수를 사용한다.fun actionStartActivity( intent: Intent, parameters: ActionParameters = actionParametersOf(),): Action = StartActivityIntentAction(intent, parameters, null)- Glance 위젯에서 특정 Activity를 시작하기 위한 Action 객체를 생성하는 함수다. - 즉, Glance의 Modifier.clickable 안에서 사용할 수 있는 동작(Action)을 만들어서 연결해 준다..
- Glance에서는 일반 Compose와는 다르게 Glance 전용 패키지로 UI 구성 요소를 제공한다.import androidx.glance.GlanceIdimport androidx.glance.GlanceModifierimport androidx.glance.Imageimport androidx.glance.ImageProviderimport androidx.glance.LocalContextimport androidx.glance.action.Actionimport androidx.glance.action.clickableimport androidx.glance.appwidget.GlanceAppWidgetimport androidx.glance.appwidget.GlanceAppWidgetM..
SeungYong.Lee
'compose' 태그의 글 목록