@Composable
fun App() {
//줌(스케일)
var scale by remember { mutableStateOf(1f) }
//뷰 이동
var offset by remember { mutableStateOf(Offset.Zero) }
//루트에서 현재 뷰의 상대 위치
var rootOffset by remember { mutableStateOf(Offset.Zero) }
//State로써 변화를 저장
val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->
scale *= zoomChange
offset += offsetChange
}
Box(
modifier = Modifier
.fillMaxSize()
//줌, 이동을 뷰에 반영
.graphicsLayer(
scaleX = scale,
scaleY = scale,
translationX = offset.x,
translationY = offset.y
)
//멀티터치 이벤트를 받기 위해 transformable을 설정
.transformable(state = state)
//onTapGesture를 위해 pointerInput을 설정
.pointerInput(Unit) {
detectTapGestures(
onTap = {
markers.add(Offset(it.x - 12.dp.value, it.y - 12.dp.value))
}
)
}
//루트뷰에서 현재 뷰의 상대 위치를 알기 위해 설정
.onGloballyPositioned {
rootOffset = it.positionInRoot()
Log.d("position", "${it.positionInRoot()}")
}
) {
Image(
painter = painterResource(id = R.drawable.img_sample),
contentDescription = "SampleImage",
modifier = Modifider.fillMaxWidth()
)
}
}
'Android(Kotlin)' 카테고리의 다른 글
심기일전 코틀린! - 앱을 만들면서 AAC 이해하기 (ViewModel, DataBinding, LiveData) (0) | 2023.07.26 |
---|---|
심기일전 코틀린! - 03. AAC (Android Architecture Components) (0) | 2023.07.20 |
심기일전 코틀린! - 02. Jetpack Compose (2) (0) | 2023.06.23 |
심기일전 코틀린! - 02. Jetpack Compose (1) (0) | 2023.06.20 |
심기일전 코틀린! - 01. ViewBinding (0) | 2023.06.12 |