import
android.animation.AnimatorInflater
import
android.animation.ValueAnimator
import
android.content.Context
import
android.graphics.Canvas
import
android.graphics.Color
import
android.graphics.Paint
import
android.graphics.Typeface
import
android.util.AttributeSet
import
android.view.View
import
androidx.core.content.ContextCompat
import
com.gfg.article.customloadingbutton.ButtonState
import
kotlin.properties.Delegates
class
LoadingButton
@JvmOverloads
constructor(
context: Context, attrs: AttributeSet? =
null
, defStyleAttr: Int =
0
) : View(context, attrs, defStyleAttr) {
private
var bgColor: Int = Color.BLACK
private
var textColor: Int = Color.BLACK
@Volatile
private
var progress: Double =
0.0
private
var valueAnimator: ValueAnimator
private
var buttonState: ButtonState by Delegates.observable(ButtonState.Completed) { p, old,
new
->
}
private
val updateListener = ValueAnimator.AnimatorUpdateListener {
progress = (it.animatedValue as Float).toDouble()
invalidate()
requestLayout()
}
fun hasCompletedDownload() {
valueAnimator.cancel()
buttonState = ButtonState.Completed
invalidate()
requestLayout()
}
init {
isClickable =
true
valueAnimator = AnimatorInflater.loadAnimator(
context,
R.animator.loading_animation
) as ValueAnimator
valueAnimator.addUpdateListener(updateListener)
val attr = context.theme.obtainStyledAttributes(
attrs,
R.styleable.LoadingButton,
0
,
0
)
try
{
bgColor = attr.getColor(
R.styleable.LoadingButton_bgColor,
ContextCompat.getColor(context, R.color.purple_200)
)
textColor = attr.getColor(
R.styleable.LoadingButton_textColor,
ContextCompat.getColor(context, R.color.white)
)
}
finally
{
attr.recycle()
}
}
private
val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.FILL
textAlign = Paint.Align.CENTER
textSize =
55
.0f
typeface = Typeface.create(
""
, Typeface.BOLD)
}
override fun performClick(): Boolean {
super
.performClick()
if
(buttonState == ButtonState.Completed) buttonState = ButtonState.Loading
animation()
return
true
}
private
fun animation() {
valueAnimator.start()
}
override fun onDraw(canvas: Canvas) {
super
.onDraw(canvas)
paint.strokeWidth = 0f
paint.color = bgColor
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
if
(buttonState == ButtonState.Loading) {
paint.color = Color.parseColor(
"#004349"
)
canvas.drawRect(
0f, 0f,
(width * (progress /
100
)).toFloat(), height.toFloat(), paint
)
}
val buttonText =
if
(buttonState == ButtonState.Loading)
resources.getString(R.string.loading)
else
resources.getString(R.string.download)
paint.color = textColor
canvas.drawText(buttonText, (width /
2
).toFloat(), ((height +
30
) /
2
).toFloat(), paint)
}
}