Skip to content

Instantly share code, notes, and snippets.

@oas004
Created December 7, 2022 22:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oas004/41321ed2171c452ae87608255bc5929b to your computer and use it in GitHub Desktop.
Save oas004/41321ed2171c452ae87608255bc5929b to your computer and use it in GitHub Desktop.
private fun calculateSegments(
height: Float,
width: Float,
trackSegments: List<ProgressIndicatorSegment>,
trackColor: Color,
cornerRadiusDp: Dp,
strokeWidth: Dp,
paddingDp: Dp,
localDensity: Density
): List<SegmentGroups> {
val cornerRadius = with(localDensity) { cornerRadiusDp.toPx() }
val stroke = with(localDensity) { Stroke(width = strokeWidth.toPx()) }
val padding = with(localDensity) { paddingDp.toPx() }
val naturalWeight = trackSegments.sumOf { it.weight.toDouble() }.toFloat()
val edgeLength =
(2 * (height - 2 * cornerRadius)) + (2 * (width - 2 * cornerRadius)) + (2 * Math.PI.toFloat() * cornerRadius)
val paddingWeight = padding / edgeLength * naturalWeight
val paddedWeight = (paddingWeight * trackSegments.size) + naturalWeight
val measures = Measures(width, height, cornerRadius, stroke)
var startWeight = 0f
var startPaddingWeight = 0f
return buildList {
trackSegments.forEachIndexed { segmentIndex, trackSegment ->
val localTrackColor = trackSegment.trackColor ?: trackColor
val indicatorColor = trackSegment.indicatorColor
val paddedRange =
((startWeight + startPaddingWeight) / paddedWeight)..((startWeight + startPaddingWeight + trackSegment.weight) / paddedWeight)
val splitSegments = measures.splitSegments(
indicatorColor = indicatorColor,
trackColor = localTrackColor,
range = paddedRange
)
add(
SegmentGroups(
groupNumber = segmentIndex,
indicatorColor = indicatorColor,
trackColor = localTrackColor,
calculatedSegments = splitSegments
)
)
startWeight += trackSegment.weight
startPaddingWeight += paddingWeight
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment