11
27

Compose๋ฅผ ์ด์šฉํ•ด RecyclerView๋ฅผ ๋‹ค ๊ต์ฒดํ–ˆ๋Š”๋ฐ, ์•„์ดํ…œ Long Press๋ฅผ ๊ฐ์ง€ํ•ด์•ผ๋˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค.

๊ทธ๋™์•ˆ์€ Long Press๋ฅผ ์“ธ ํ•„์š”๊ฐ€ ์—†์–ด์„œ clickable ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ ํ•œ๋ฒˆ ๋ฐ”๊ฟ”๋ณด์ž.

Modifier
    .combinedClickable(
        onClick = { },
        onLongClick = { },
    )

์ œ์ผ ๋จผ์ € ์‹œ๋„ํ•ด๋ณธ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ MediationSource๋ฅผ ์ œ๊ณตํ•ด์•ผ๋จ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์— ์–ด๋ ค์›€์ด ์žˆ๋‹ค... 2022๋…„๊นŒ์ง€๋Š” ์ž˜ ๋๋˜ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋œ๋‹ค.

 

์กฐ๊ธˆ ๋” ์ฐพ์•„๋ณด๋‹ˆ pointerInput๋ฅผ ์ด์šฉํ•ด ์ œ์Šค์ฒ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

Modifier.pointerInput(Unit) {
    detectTapGestures(
        onPress = { /* Called when the gesture starts */ },
        onDoubleTap = { /* Called on Double Tap */ },
        onLongPress = { /* Called on Long Press */ },
        onTap = { /* Called on Tap */ }
    )
}

pointerInput์— detectTapGestures๋ฅผ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋˜ ํด๋ฆญ์ด๋ฒคํŠธ๋ฅผ ์ข…๋ฅ˜๋ณ„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.  ์œ„ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฝ”๋“œ์ด๊ณ  ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ํŒŒ๋ณด์ž.

suspend fun PointerInputScope.detectTapGestures(
    onDoubleTap: ((Offset) -> Unit)? = null,
    onLongPress: ((Offset) -> Unit)? = null,
    onPress: suspend PressGestureScope.(Offset) -> Unit = NoPressGesture,
    onTap: ((Offset) -> Unit)? = null
): Unit

 

๊ฐ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Offset์„ ๋ฐ›๋Š”๋‹ค.

 

Offset์„ ์ด์šฉํ•ด ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๋ฐ, ํฌ์ธํ„ฐ ๋‹ค์šด(ํ„ฐ์น˜ ์‹œ์ž‘), ํฌ์ธํ„ฐ ์—…(์† ๋—Œ)์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์ตœ์ดˆ ํฌ์ธํ„ฐ ๋‹ค์šด ํ›„ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ๋‹ค์šด์ด ์ƒ๊ธฐ๋ฉด ์ด์ „ ์ œ์Šค์ฒ˜๊ฐ€ ์ทจ์†Œ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํฌ์ธํ„ฐ ๋‹ค์šด ํ›„ ํฌ์ธํ„ฐ ์—…์ด๋ฉด ๋‹ค์šด ์ œ์Šค์ฒ˜๊ฐ€ ์†Œ๋น„๋˜๋ฉด์„œ ์œ„ 4๊ฐ€์ง€ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ ๋‹ค์šด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ์—์„œ ์†Œ๋น„๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๊ณณ์—์„œ ์†Œ๋น„๋œ๋‹ค๋ฉด ์ด๊ฑด Tap์œผ๋กœ ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ์Šค์ฒ˜๋ฅผ ๊ฑด๋„ˆ ๋›ด๋‹ค.

            Modifier
                .fillMaxWidth()
                .padding(0.dp, 2.dp, 0.dp, 4.dp)
                .pointerInput(Unit) {
                    detectTapGestures(
                        onLongPress = {
                            if (sharedViewModel.isManager) {
                                viewModel.deletePost(post.date)
                            }
                        }
                    )
                }

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” null๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์–ด์„œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, onDoubleTap์ด ๋น„ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๋Š”๋ฐ ๋‘๋ฒˆ ํƒญํ•˜๋ฉด ๊ทธ๊ฑด Tap์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

 

https://developer.android.com/jetpack/compose/gestures?hl=ko#tapping

 

๋™์ž‘  |  Jetpack Compose  |  Android Developers

๋™์ž‘ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. Compose๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์ƒ์„ฑ๋œ ๋™์ž‘์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด API

developer.android.com

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT