Untitled
CustomProgressBarsInCircleunknown
kotlin
5 years ago
2.8 kB
31
Indexable
class HalfCircleView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val darkGreenPaint = Paint().apply {
style = Paint.Style.FILL
isAntiAlias = true
color = Color.parseColor("#388E3C")
}
private val lightGreenPaint = Paint().apply {
style = Paint.Style.FILL
isAntiAlias = true
color = Color.parseColor("#81C784")
}
private val whitePaint = Paint().apply {
style = Paint.Style.STROKE
strokeWidth = 16f
isAntiAlias = true
color = Color.WHITE
}
private val leftProgressBar = Path()
private val rightProgressBar = Path()
private var leftIndicatorHeight = 100f
private var rightIndicatorHeight = 100f
private val margin = 16f
private var leftRectF = RectF()
private val rightRectF = RectF()
private val circlePath = Path()
private val leftProgressBarPath = Path()
private val rightProgressBarPath = Path()
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val centerX = width / 2f
val centerY = height / 2f
val radius: Float = if (width > height) centerY - margin else centerX - margin
val leftProgressBarHeight = leftIndicatorHeight * (height / 100)
val rightProgressBarHeight = rightIndicatorHeight * (height / 100)
leftRectF.apply {
left = centerX
right = 0f
top = leftProgressBarHeight - margin
bottom = height.toFloat() - margin
}
rightRectF.apply {
left = centerX
right = width.toFloat()
top = rightProgressBarHeight - margin
bottom = height.toFloat() - margin
}
circlePath.addCircle(centerX, centerY, radius, Path.Direction.CW)
leftProgressBarPath.addRect(leftRectF, Path.Direction.CW)
rightProgressBarPath.addRect(rightRectF, Path.Direction.CW)
//intersecting rectangles with circle
leftProgressBar.op(leftProgressBarPath, circlePath, Path.Op.INTERSECT)
rightProgressBar.op(rightProgressBarPath, circlePath, Path.Op.INTERSECT)
//drawing left & right progress indicators
canvas.drawPath(leftProgressBar, darkGreenPaint)
canvas.drawPath(rightProgressBar, lightGreenPaint)
//drawing white circle with vertical line
canvas.drawCircle(centerX, centerY, radius, whitePaint)
canvas.drawLine(centerX, margin, centerX, height.toFloat() - margin, whitePaint);
}
fun setProgress(leftValue: Float, rightValue: Float) {
leftIndicatorHeight = 100f - leftValue
rightIndicatorHeight = 100f - rightValue
invalidate()
}
}Editor is loading...