parent
5f7c18a781
commit
48bfabcbea
@ -1,67 +1,54 @@ |
|||||||
package io.legado.app.ui.widget |
package io.legado.app.ui.widget |
||||||
|
|
||||||
|
import android.annotation.SuppressLint |
||||||
import android.content.Context |
import android.content.Context |
||||||
import android.graphics.Canvas |
import android.graphics.Canvas |
||||||
import android.graphics.Paint |
import android.graphics.Paint |
||||||
import android.graphics.Rect |
import android.graphics.Rect |
||||||
import android.graphics.Typeface |
|
||||||
import android.text.StaticLayout |
|
||||||
import android.text.TextPaint |
|
||||||
import android.util.AttributeSet |
import android.util.AttributeSet |
||||||
import android.view.View |
|
||||||
import androidx.annotation.ColorInt |
import androidx.annotation.ColorInt |
||||||
|
import androidx.appcompat.widget.AppCompatTextView |
||||||
import io.legado.app.R |
import io.legado.app.R |
||||||
import io.legado.app.utils.dp |
import io.legado.app.utils.dp |
||||||
import io.legado.app.utils.getCompatColor |
import io.legado.app.utils.getCompatColor |
||||||
import io.legado.app.utils.sp |
|
||||||
|
|
||||||
class BatteryView(context: Context, attrs: AttributeSet?) : View(context, attrs) { |
class BatteryView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) { |
||||||
private var battery = 100 |
private val batteryPaint = Paint() |
||||||
private val textPaint = TextPaint() |
|
||||||
private var batteryHeight: Int = 0 |
|
||||||
private var batteryWidth: Int = 0 |
|
||||||
private val outFrame = Rect() |
private val outFrame = Rect() |
||||||
private val polar = Rect() |
private val polar = Rect() |
||||||
|
|
||||||
init { |
init { |
||||||
textPaint.textSize = 10.sp.toFloat() |
setPadding(4.dp, 0, 6.dp, 0) |
||||||
textPaint.strokeWidth = 1.dp.toFloat() |
batteryPaint.strokeWidth = 1.dp.toFloat() |
||||||
textPaint.isAntiAlias = true |
batteryPaint.isAntiAlias = true |
||||||
textPaint.textAlign = Paint.Align.CENTER |
batteryPaint.color = context.getCompatColor(R.color.tv_text_default) |
||||||
textPaint.color = context.getCompatColor(R.color.tv_text_default) |
|
||||||
textPaint.typeface = Typeface.createFromAsset(context.assets, "number.ttf") |
|
||||||
batteryHeight = with(textPaint.fontMetrics) { descent - ascent + leading }.toInt() |
|
||||||
batteryWidth = StaticLayout.getDesiredWidth("100", textPaint).toInt() + 10.dp |
|
||||||
outFrame.set(1.dp, 1.dp, batteryWidth - 3.dp, batteryHeight - 1.dp) |
|
||||||
polar.set(outFrame.right, batteryHeight / 3, batteryWidth, batteryHeight * 2 / 3) |
|
||||||
} |
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { |
|
||||||
super.onMeasure( |
|
||||||
MeasureSpec.makeMeasureSpec(batteryWidth, MeasureSpec.EXACTLY), |
|
||||||
MeasureSpec.makeMeasureSpec(batteryHeight, MeasureSpec.EXACTLY) |
|
||||||
) |
|
||||||
} |
} |
||||||
|
|
||||||
fun setColor(@ColorInt color: Int) { |
fun setColor(@ColorInt color: Int) { |
||||||
textPaint.color = color |
setTextColor(color) |
||||||
|
batteryPaint.color = color |
||||||
invalidate() |
invalidate() |
||||||
} |
} |
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n") |
||||||
fun setBattery(battery: Int) { |
fun setBattery(battery: Int) { |
||||||
this.battery = battery |
text = "$battery" |
||||||
invalidate() |
|
||||||
} |
} |
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) { |
override fun onDraw(canvas: Canvas) { |
||||||
super.onDraw(canvas) |
super.onDraw(canvas) |
||||||
textPaint.style = Paint.Style.STROKE |
outFrame.set( |
||||||
canvas.drawRect(outFrame, textPaint) |
1.dp, |
||||||
textPaint.style = Paint.Style.FILL |
layout.getLineTop(0) + 2.dp, |
||||||
canvas.drawRect(polar, textPaint) |
width - 3.dp, |
||||||
val text = battery.toString() |
layout.getLineBottom(0) - 2.dp |
||||||
val baseHeight = batteryHeight - textPaint.fontMetrics.descent |
) |
||||||
canvas.drawText(text, outFrame.right / 2.toFloat(), baseHeight, textPaint) |
val dj = (outFrame.bottom - outFrame.top) / 3 |
||||||
|
polar.set(outFrame.right, outFrame.top + dj, width - 1.dp, outFrame.bottom - dj) |
||||||
|
batteryPaint.style = Paint.Style.STROKE |
||||||
|
canvas.drawRect(outFrame, batteryPaint) |
||||||
|
batteryPaint.style = Paint.Style.FILL |
||||||
|
canvas.drawRect(polar, batteryPaint) |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
Loading…
Reference in new issue