From a9f61e0663b1940c5887037b44b7caebb3d3dada Mon Sep 17 00:00:00 2001 From: zzh Date: Thu, 27 Nov 2025 14:15:31 +0800 Subject: [PATCH] =?UTF-8?q?=20=E7=81=AF=E5=85=89=E4=BA=AE=E5=BA=A6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=A7=A6=E6=8E=A7=E6=8B=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/smarthome/ui/MainScaffold.kt | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/example/smarthome/ui/MainScaffold.kt b/app/src/main/java/com/example/smarthome/ui/MainScaffold.kt index 49c4748..c451f51 100644 --- a/app/src/main/java/com/example/smarthome/ui/MainScaffold.kt +++ b/app/src/main/java/com/example/smarthome/ui/MainScaffold.kt @@ -40,6 +40,7 @@ import android.view.SoundEffectConstants import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.gestures.detectHorizontalDragGestures import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.foundation.layout.offset import androidx.compose.ui.draw.rotate @@ -1342,23 +1343,47 @@ fun LightList(modifier: Modifier = Modifier) { @Composable fun DotsProgress(percent: Float, onPercentChange: (Float) -> Unit = {}, enabled: Boolean = true) { val total = 12 + Row( horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.pointerInput(enabled) { - if (enabled) { - detectTapGestures { offset -> - // 计算点击的是第几个点 - val dotWidth = 6.dp.toPx() + modifier = Modifier + .pointerInput(enabled) { + if (enabled) { + val dotWidth = 8.dp.toPx() val spacing = 4.dp.toPx() val totalWidth = (dotWidth + spacing) * total - spacing - val clickedIndex = ((offset.x / totalWidth) * total).toInt().coerceIn(0, total - 1) - // 更新百分比 - val newPercent = (clickedIndex + 1).toFloat() / total - onPercentChange(newPercent) + + // 支持拖动手势 + detectHorizontalDragGestures( + onDragStart = { offset -> + // 开始拖动时立即更新 + val newPercent = (offset.x / totalWidth).coerceIn(0f, 1f) + onPercentChange(newPercent) + }, + onDragEnd = { }, + onDragCancel = { }, + onHorizontalDrag = { change, _ -> + change.consume() + val newPercent = (change.position.x / totalWidth).coerceIn(0f, 1f) + onPercentChange(newPercent) + } + ) + } + } + .pointerInput(enabled) { + if (enabled) { + val dotWidth = 8.dp.toPx() + val spacing = 4.dp.toPx() + val totalWidth = (dotWidth + spacing) * total - spacing + + // 也支持点击 + detectTapGestures { offset -> + val newPercent = (offset.x / totalWidth).coerceIn(0f, 1f) + onPercentChange(newPercent) + } } } - } ) { repeat(total) { i -> val filled = i < (percent * total).toInt() @@ -1367,11 +1392,6 @@ fun DotsProgress(percent: Float, onPercentChange: (Float) -> Unit = {}, enabled: .size(8.dp) .clip(RoundedCornerShape(4.dp)) .background(if (filled) Color(0xFFA9F0FF) else Color(0xFF3A3A3A)) - .clickable(enabled = enabled) { - // 点击某个点直接设置到该亮度 - val newPercent = (i + 1).toFloat() / total - onPercentChange(newPercent) - } ) } }