Skip to content

Commit

Permalink
Added icon support in compose
Browse files Browse the repository at this point in the history
  • Loading branch information
Shahryar Khosravi committed Mar 16, 2022
1 parent 80cb8f7 commit 843468c
Showing 1 changed file with 63 additions and 47 deletions.
110 changes: 63 additions & 47 deletions AirBar/src/main/java/com/shahryar/airbar/AirBarCompose.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package com.shahryar.airbar

import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Icon
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.RoundRect
import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
Expand All @@ -24,6 +29,7 @@ fun AirBar(
cornerRadius: Dp = 40.dp,
minValue: Double = 0.0,
maxValue: Double = 100.0,
icon: Painter? = null,
onValuesChanged: (percentage: Double, value: Double) -> Unit
) {
var progress: Float by remember {
Expand All @@ -49,57 +55,67 @@ fun AirBar(
return Pair(percentage, value)
}

Canvas(modifier = modifier.pointerInteropFilter { event ->
when {
event.y in 0.0..bottomY.toDouble() -> {
progress = event.y
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
Box(modifier = modifier, contentAlignment = Alignment.BottomCenter) {
Canvas(modifier = modifier.pointerInteropFilter { event ->
when {
event.y in 0.0..bottomY.toDouble() -> {
progress = event.y
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
}
event.y > 100 -> {
progress = bottomY
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
}
event.y < 0 -> {
progress = 0F
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
}
else -> false
}
event.y > 100 -> {
progress = bottomY
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
}
event.y < 0 -> {
progress = 0F
val values = calculateValues(event.y)
onValuesChanged(values.first, values.second)
true
}
else -> false
}) {
bottomY = size.height

val path = Path()
path.addRoundRect(
roundRect = RoundRect(
0F,
0F,
size.width,
size.height,
CornerRadius(x = cornerRadius.value, y = cornerRadius.value)
)
)
drawContext.canvas.drawPath(path, Paint().apply {
color = backgroundColor
isAntiAlias = true
})
drawContext.canvas.clipPath(path = path, ClipOp.Intersect)
drawContext.canvas.drawRect(0F, progress, size.width, size.height, Paint().apply {
color = fillColor
isAntiAlias = true
if (!fillColorGradient.isNullOrEmpty() && fillColorGradient.size > 1) {
shader = LinearGradientShader(
from = Offset(0f, 0f),
to = Offset(size.width, size.height),
colors = fillColorGradient
)
}
})
}
}) {
bottomY = size.height

val path = Path()
path.addRoundRect(
roundRect = RoundRect(
0F,
0F,
size.width,
size.height,
CornerRadius(x = cornerRadius.value, y = cornerRadius.value)
icon?.let {
Icon(
modifier = Modifier.padding(bottom = 15.dp),
painter = it,
contentDescription = ""
)
)
drawContext.canvas.drawPath(path, Paint().apply {
color = backgroundColor
isAntiAlias = true
})
drawContext.canvas.clipPath(path = path, ClipOp.Intersect)
drawContext.canvas.drawRect(0F, progress, size.width, size.height, Paint().apply {
color = fillColor
isAntiAlias = true
if (!fillColorGradient.isNullOrEmpty() && fillColorGradient.size > 1) {
shader = LinearGradientShader(
from = Offset(0f, 0f),
to = Offset(size.width, size.height),
colors = fillColorGradient
)
}
})
}
}
}

Expand Down

0 comments on commit 843468c

Please sign in to comment.