[英]Avoid accidental tap/touch in a Jetpack Compose Slider which is placed inside in a scrollable column
我有一个 Slider 放置在可滚动的列内。 当我滚动浏览组件时,有时 slider 值会因意外触摸而发生变化。 我怎样才能避免这种情况?
我应该禁用 slider 上的水龙头吗? 如果是,我该怎么做?
有没有像嵌套滚动而不是列这样的替代方法可以防止这种情况发生?
@Composable fun ColumnScope.FilterRange( title: String, range: ClosedFloatingPointRange<Float>, rangeText: String, valueRange: ClosedFloatingPointRange<Float>, onValueChange: (ClosedFloatingPointRange<Float>) -> Unit, ) { Spacer(modifier = Modifier.height(Size_Regular)) Text( text = title, style = MaterialTheme.typography.h6 ) Spacer(modifier = Modifier.height(Size_X_Small)) Text( text = rangeText, style = MaterialTheme.typography.subtitle1 ) RangeSlider( modifier = Modifier.fillMaxWidth(), values = range, valueRange = valueRange, onValueChange = { onValueChange(it) }) Spacer(modifier = Modifier.height(Size_Small)) Divider(thickness = DividerSize) }
我会禁用 RangeSlider 并仅在您点击它时启用它。 您可以通过点击列中的其他任何位置来禁用它。 这是用于模仿失去焦点的类似行为。 这是一个例子:
class MainActivity : ComponentActivity() {
@ExperimentalMaterialApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startActivity(intent)
setContent {
var rangeEndabled by remember { mutableStateOf(false)}.apply { this.value }
var sliderPosition by remember { mutableStateOf(0f..100f) }
Text(text = sliderPosition.toString())
Column(modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.pointerInput(Unit) {
detectTapGestures(
onTap = {
rangeEndabled = false
}
)
}) {
repeat(30) {
Text(it.toString())
}
RangeSlider(
enabled = rangeEndabled,
values = sliderPosition,
onValueChange = { sliderPosition = it },
valueRange = 0f..100f,
onValueChangeFinished = {
// launch some business logic update with the state you hold
// viewModel.updateSelectedSliderValue(sliderPosition)
},
modifier = Modifier.pointerInput(Unit) {
detectTapGestures(
onTap = {
rangeEndabled = true
}
)
}
)
repeat(30) {
Text(it.toString())
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.