이미 쓴 글이 있지만 솔직히 너무 별로라서 새로 만들어봤다.
(솔직히 내가 만들어놓고도 이건 좀.. 하고 있었음)
2024.01.14 - [Android/Android Compose] - [안드로이드 컴포즈] 스와이프 삭제 구현
핵심 키워드는 DraggableAnchors, AnchoredDraggableState
이고 구현에 관심이 있다면 위 검색어로 찾아보면 훨씬 쉽고 자연스럽게 뚝딱하고 만들 수 있다.
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun SwipeScreen(
contentComposable: @Composable () -> Unit,
buttonComposable: @Composable () -> Unit,
buttonModifier : Modifier,
clickAction : () -> Unit
) {
val density = LocalDensity.current
val screenSizeDp = LocalConfiguration.current.screenWidthDp.dp
var buttonVisible by remember { mutableStateOf(false) }
val anchors = remember {
DraggableAnchors {
DragValue.Start at 0f
DragValue.End at -250f
}
}
val state = remember {
AnchoredDraggableState(
initialValue = DragValue.Start,
positionalThreshold = { with(density) { 130.dp.toPx() } },
velocityThreshold = { with(density) { 130.dp.toPx() } },
animationSpec = tween(),
)
}
SideEffect { state.updateAnchors(anchors) }
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.height(100.dp)
) {
Box(
Modifier
.fillMaxSize()
.anchoredDraggable(state, Orientation.Horizontal)
) {
Box(modifier = Modifier
.width(80.dp)
.height(78.dp)
.align(Alignment.CenterEnd)
.clip(RoundedCornerShape(12.dp))
.background(color = LinkZipTheme.color.redFB5B63)
.padding(
vertical = 10.dp
)
.clickable {
},
) {
Box(modifier = buttonModifier
.align(Alignment.Center)
.clickable {
clickAction()
}){
buttonComposable()
}
}
Box(
Modifier
.offset {
IntOffset(
x = state
.requireOffset()
.roundToInt(),
y = 0
)
} // x = 0 Horizontal
){
contentComposable()
}
}
}
}
반응형
'Android > Android Compose' 카테고리의 다른 글
Android Compose 의 @Immutable 와 @Stable (0) | 2024.08.20 |
---|---|
컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 2 (0) | 2024.04.28 |
컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1 (0) | 2024.04.21 |
Jetpack Compose CompositionLocal 에 대해 알아봅시다 (0) | 2024.03.31 |
[안드로이드 컴포즈] 스와이프 삭제 구현 (1) | 2024.01.14 |
안드로이드 컴포즈 dialog 커스텀 하기 (0) | 2023.12.20 |
Jetpack Compose 에서 Lifecycle 관리하기 (0) | 2023.05.11 |
안드로이드 컴포즈 1주차 정리 (0) | 2021.11.07 |