Skip to content

Commit 33afdc4

Browse files
authored
Merge pull request #19 from kez-lab/feature/picker_click_animation
feat: Add clickable functionality to Picker items and set visibleItem…
2 parents e91d1e6 + 5f0fb4f commit 33afdc4

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

datetimepicker/src/commonMain/kotlin/com/kez/picker/Picker.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.kez.picker
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.clickable
45
import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
6+
import androidx.compose.foundation.interaction.MutableInteractionSource
57
import androidx.compose.foundation.layout.Box
68
import androidx.compose.foundation.layout.PaddingValues
79
import androidx.compose.foundation.layout.fillMaxWidth
@@ -20,10 +22,12 @@ import androidx.compose.runtime.LaunchedEffect
2022
import androidx.compose.runtime.derivedStateOf
2123
import androidx.compose.runtime.getValue
2224
import androidx.compose.runtime.remember
25+
import androidx.compose.runtime.rememberCoroutineScope
2326
import androidx.compose.runtime.snapshotFlow
2427
import androidx.compose.ui.Alignment
2528
import androidx.compose.ui.Modifier
2629
import androidx.compose.ui.draw.drawWithContent
30+
import androidx.compose.ui.semantics.Role
2731
import androidx.compose.ui.graphics.BlendMode
2832
import androidx.compose.ui.graphics.Brush
2933
import androidx.compose.ui.graphics.Color
@@ -42,6 +46,7 @@ import androidx.compose.ui.unit.lerp
4246
import androidx.compose.ui.unit.sp
4347
import kotlinx.coroutines.flow.distinctUntilChanged
4448
import kotlinx.coroutines.flow.mapNotNull
49+
import kotlinx.coroutines.launch
4550
import kotlin.math.abs
4651

4752
/**
@@ -93,6 +98,7 @@ fun <T> Picker(
9398
) {
9499
val density = LocalDensity.current
95100
val visibleItemsMiddle = remember { visibleItemsCount / 2 }
101+
val scope = rememberCoroutineScope()
96102

97103
val adjustedItems = if (!isInfinity) {
98104
listOf(null) + items + listOf(null)
@@ -205,6 +211,22 @@ fun <T> Picker(
205211
modifier = Modifier
206212
.height(itemHeight)
207213
.fillMaxWidth()
214+
.clickable(
215+
enabled = getItem(index) != null,
216+
role = Role.Button,
217+
indication = null,
218+
interactionSource = remember { MutableInteractionSource() },
219+
onClick = {
220+
val currentCenterIndex = listState.firstVisibleItemIndex + visibleItemsMiddle
221+
if (index != currentCenterIndex) {
222+
scope.launch {
223+
val targetIndex = (index - visibleItemsMiddle)
224+
.coerceIn(0, listScrollCount - 1)
225+
listState.animateScrollToItem(targetIndex)
226+
}
227+
}
228+
}
229+
)
208230
.padding(itemPadding),
209231
contentAlignment = Alignment.Center
210232
) {

sample/src/commonMain/kotlin/com/kez/picker/sample/ui/screen/TimePickerSampleScreen.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ import androidx.compose.ui.text.font.FontWeight
3434
import androidx.compose.ui.tooling.preview.Preview
3535
import androidx.compose.ui.unit.dp
3636
import androidx.compose.ui.unit.sp
37-
import androidx.navigation.NavController
38-
import androidx.navigation.compose.rememberNavController
3937
import com.kez.picker.rememberPickerState
4038
import com.kez.picker.time.TimePicker
4139
import com.kez.picker.util.TimeFormat
@@ -170,6 +168,7 @@ internal fun TimePickerSampleScreen(
170168
TimePicker(
171169
hourPickerState = hour24State,
172170
minutePickerState = minuteState,
171+
visibleItemsCount = 5,
173172
timeFormat = TimeFormat.HOUR_24
174173
)
175174
}

0 commit comments

Comments
 (0)