pull/32/head
parent
0f2b08b56f
commit
37f91e8ed4
@ -0,0 +1,204 @@ |
||||
package io.legado.app.ui.widget.anima |
||||
|
||||
import android.content.Context |
||||
import android.graphics.Canvas |
||||
import android.graphics.Paint |
||||
import android.graphics.Rect |
||||
import android.graphics.RectF |
||||
import android.os.Looper |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
|
||||
import io.legado.app.R |
||||
|
||||
class RefreshProgressBar @JvmOverloads constructor( |
||||
context: Context, |
||||
attrs: AttributeSet? = null, |
||||
defStyleAttr: Int = 0 |
||||
) : View(context, attrs, defStyleAttr) { |
||||
internal var a = 1 |
||||
var maxProgress = 100 |
||||
private var durProgress = 0 |
||||
var secondMaxProgress = 100 |
||||
private var secondDurProgress = 0 |
||||
var bgColor = 0x00000000 |
||||
var secondColor = -0x3e3e3f |
||||
var fontColor = -0xc9c9ca |
||||
var speed = 1 |
||||
var secondFinalProgress = 0 |
||||
private set |
||||
private var paint: Paint = Paint() |
||||
private val bgRect = Rect() |
||||
private val secondRect = Rect() |
||||
private val fontRectF = RectF() |
||||
|
||||
var isAutoLoading: Boolean = false |
||||
set(loading) { |
||||
if (loading && visibility != VISIBLE) { |
||||
visibility = VISIBLE |
||||
} |
||||
field = loading |
||||
if (!this.isAutoLoading) { |
||||
secondDurProgress = 0 |
||||
secondFinalProgress = 0 |
||||
} |
||||
maxProgress = 0 |
||||
|
||||
invalidate() |
||||
} |
||||
|
||||
init { |
||||
paint.style = Paint.Style.FILL |
||||
|
||||
val a = context.obtainStyledAttributes(attrs, R.styleable.RefreshProgressBar) |
||||
speed = a.getDimensionPixelSize(R.styleable.RefreshProgressBar_speed, speed) |
||||
maxProgress = a.getInt(R.styleable.RefreshProgressBar_max_progress, maxProgress) |
||||
durProgress = a.getInt(R.styleable.RefreshProgressBar_dur_progress, durProgress) |
||||
secondDurProgress = a.getDimensionPixelSize( |
||||
R.styleable.RefreshProgressBar_second_dur_progress, |
||||
secondDurProgress |
||||
) |
||||
secondFinalProgress = secondDurProgress |
||||
secondMaxProgress = a.getDimensionPixelSize( |
||||
R.styleable.RefreshProgressBar_second_max_progress, |
||||
secondMaxProgress |
||||
) |
||||
bgColor = a.getColor(R.styleable.RefreshProgressBar_bg_color, bgColor) |
||||
secondColor = a.getColor(R.styleable.RefreshProgressBar_second_color, secondColor) |
||||
fontColor = a.getColor(R.styleable.RefreshProgressBar_font_color, fontColor) |
||||
a.recycle() |
||||
} |
||||
|
||||
override fun onDraw(canvas: Canvas) { |
||||
super.onDraw(canvas) |
||||
|
||||
paint.color = bgColor |
||||
bgRect.set(0, 0, measuredWidth, measuredHeight) |
||||
canvas.drawRect(bgRect, paint) |
||||
|
||||
if (secondDurProgress > 0 && secondMaxProgress > 0) { |
||||
var secondDur = secondDurProgress |
||||
if (secondDur < 0) { |
||||
secondDur = 0 |
||||
} |
||||
if (secondDur > secondMaxProgress) { |
||||
secondDur = secondMaxProgress |
||||
} |
||||
paint.color = secondColor |
||||
val tempW = |
||||
(measuredWidth.toFloat() * 1.0f * (secondDur * 1.0f / secondMaxProgress)).toInt() |
||||
secondRect.set( |
||||
measuredWidth / 2 - tempW / 2, |
||||
0, |
||||
measuredWidth / 2 + tempW / 2, |
||||
measuredHeight |
||||
) |
||||
canvas.drawRect(secondRect, paint) |
||||
} |
||||
|
||||
if (durProgress > 0 && maxProgress > 0) { |
||||
paint.color = fontColor |
||||
fontRectF.set( |
||||
0f, |
||||
0f, |
||||
measuredWidth.toFloat() * 1.0f * (durProgress * 1.0f / maxProgress), |
||||
measuredHeight.toFloat() |
||||
) |
||||
canvas.drawRect(fontRectF, paint) |
||||
} |
||||
|
||||
if (this.isAutoLoading) { |
||||
if (secondDurProgress >= secondMaxProgress) { |
||||
a = -1 |
||||
} else if (secondDurProgress <= 0) { |
||||
a = 1 |
||||
} |
||||
secondDurProgress += a * speed |
||||
if (secondDurProgress < 0) |
||||
secondDurProgress = 0 |
||||
else if (secondDurProgress > secondMaxProgress) |
||||
secondDurProgress = secondMaxProgress |
||||
secondFinalProgress = secondDurProgress |
||||
invalidate() |
||||
} else { |
||||
if (secondDurProgress != secondFinalProgress) { |
||||
if (secondDurProgress > secondFinalProgress) { |
||||
secondDurProgress -= speed |
||||
if (secondDurProgress < secondFinalProgress) { |
||||
secondDurProgress = secondFinalProgress |
||||
} |
||||
} else { |
||||
secondDurProgress += speed |
||||
if (secondDurProgress > secondFinalProgress) { |
||||
secondDurProgress = secondFinalProgress |
||||
} |
||||
} |
||||
this.invalidate() |
||||
} |
||||
if (secondDurProgress == 0 && durProgress == 0 && secondFinalProgress == 0 && visibility == VISIBLE) { |
||||
visibility = INVISIBLE |
||||
} |
||||
} |
||||
} |
||||
|
||||
fun getDurProgress(): Int { |
||||
return durProgress |
||||
} |
||||
|
||||
fun setDurProgress(durProgress: Int) { |
||||
var durProgress1 = durProgress |
||||
if (durProgress1 < 0) { |
||||
durProgress1 = 0 |
||||
} |
||||
if (durProgress1 > maxProgress) { |
||||
durProgress1 = maxProgress |
||||
} |
||||
this.durProgress = durProgress1 |
||||
if (Looper.myLooper() == Looper.getMainLooper()) { |
||||
this.invalidate() |
||||
} else { |
||||
this.postInvalidate() |
||||
} |
||||
} |
||||
|
||||
fun getSecondDurProgress(): Int { |
||||
return secondDurProgress |
||||
} |
||||
|
||||
fun setSecondDurProgress(secondDur: Int) { |
||||
this.secondDurProgress = secondDur |
||||
this.secondFinalProgress = secondDurProgress |
||||
if (Looper.myLooper() == Looper.getMainLooper()) { |
||||
this.invalidate() |
||||
} else { |
||||
this.postInvalidate() |
||||
} |
||||
} |
||||
|
||||
fun setSecondDurProgressWithAnim(secondDur: Int) { |
||||
var secondDur1 = secondDur |
||||
if (secondDur1 < 0) { |
||||
secondDur1 = 0 |
||||
} |
||||
if (secondDur1 > secondMaxProgress) { |
||||
secondDur1 = secondMaxProgress |
||||
} |
||||
this.secondFinalProgress = secondDur1 |
||||
if (Looper.myLooper() == Looper.getMainLooper()) { |
||||
this.invalidate() |
||||
} else { |
||||
this.postInvalidate() |
||||
} |
||||
} |
||||
|
||||
fun clean() { |
||||
durProgress = 0 |
||||
secondDurProgress = 0 |
||||
secondFinalProgress = 0 |
||||
if (Looper.myLooper() == Looper.getMainLooper()) { |
||||
this.invalidate() |
||||
} else { |
||||
this.postInvalidate() |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue