/
Irisska
/
Task9
Обзор
Документация
Войти
/
Irisska
/
Task9
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
progress_bar1
app/src/main/java/com/example/progressbar/customview/CircularProgressView.kt
87 строк
3 KB
Irisska
ProgressBar
19 мар 2025, 23:08
19 мар 2025, 23:08
c4face9
Код
Авторство
О чём код?
package com.example.progressbar.customview import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.text.style.TextAlign import kotlinx.coroutines.delay import kotlin.math.min @Composable fun CircularProgressBar() { // Состояние прогресса var progress = remember { mutableStateOf(0f) } // Плавное изменение прогресса от 0 до 1 val animatedProgress = animateFloatAsState( targetValue = progress.value, animationSpec = androidx.compose.animation.core.tween( durationMillis = 500, // Скорость анимации delayMillis = 0 ) ).value // Обновляем прогресс, когда он достигает 100% LaunchedEffect(progress.value) { if (animatedProgress >= 0.99f) { progress.value = 0f // Сбрасываем прогресс, если он достиг 100% } else { progress.value += 0.01f // Увеличиваем прогресс } } Box( contentAlignment = Alignment.Center, modifier = Modifier.size(200.dp) // Размер прогресс-бара ) { Canvas(modifier = Modifier.size(200.dp)) { // Используем фиксированный размер для Canvas val size = min(this.size.width, this.size.height) // Получаем минимальный размер холста val strokeWidth = size * 0.1f // Толщина линии val radius = size / 2 - strokeWidth / 2 // Фоновый круг drawCircle( color = Color.LightGray, radius = radius, style = Stroke(strokeWidth) ) // Прогресс (заполненная часть) drawArc( color = Color.Blue, startAngle = -90f, sweepAngle = animatedProgress * 360f, // Анимируем прогресс от 0 до 360 градусов useCenter = false, style = Stroke(strokeWidth, cap = StrokeCap.Round), size = Size(radius * 2, radius * 2), topLeft = Offset(strokeWidth / 2, strokeWidth / 2) ) } // Текст с процентом Text( text = "${(animatedProgress * 100).toInt()}%", // Показываем процент прогресса fontSize = 24.sp, color = Color.Black, textAlign = TextAlign.Center ) } }