最近产品研发需求需要显示在线设备的电池电量状态,然后UI给出的效果的图是这样的
于是就开始了自定义个,因为是项目特定的UI所以很多属性都没有直接抽取到styles里面了,直接上代码(因为项目是使用kotlin的,所以直接用kotlin进行编程了,当然也附带了Java版本的)
kotlin版本(里面用到的颜色值可自定义,这里是使用项目工具类转过来的):
package com.view
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
import com.blankj.utilcode.util.ColorUtils
import com.blankj.utilcode.util.ImageUtils
import com.view.R
/**
* @CreateDate:
* @Author:lp
* @Description:
*/
class BatteryView @JvmOverloads constructor(context: Context?, attrs: AttributeSet? = null) :
View(context, attrs) {
private val batteryBodyPainter: Paint//电池外边框画笔
private val batteryHeadPainter: Paint//电池盖画笔
private val mPowerPaint: Paint//电量画笔
private val outlineRect: RectF//电池矩形
private val mCapRect: RectF//电池盖矩形
private val batteryRect: RectF//电量矩形
private var fullPowerWidth = 0f //满电量时电池体的宽度。
private var battery = 20
private var leftPoint = 0f
private var topPoint = 0f
fun setBattery(battery: Int) {
this.battery = battery
invalidate()
}
fun getBattery(): Int {
return battery
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val specWidthSize = MeasureSpec.getSize(widthMeasureSpec) //宽
val specHeightSize = MeasureSpec.getSize(heightMeasureSpec) //高
//设置电池外框
outlineRect.right = specWidthSize - OUTLINE_THICKNESS - CAP_WIDTH
outlineRect.bottom = specHeightSize - OUTLINE_THICKNESS
//设置电池盖矩形
mCapRect.left = outlineRect.right
mCapRect.top = specHeightSize.toFloat() / 2 - CAP_HEIGHT / 2
mCapRect.right = specWidthSize.toFloat()
mCapRect.bottom = specHeightSize.toFloat() / 2 + CAP_HEIGHT / 2
//设置电池体
batteryRect.left = outlineRect.left + GAP_OF_SHAPE_BODY
batteryRect.top = outlineRect.top + GAP_OF_SHAPE_BODY
batteryRect.bottom = outlineRect.bottom - GAP_OF_SHAPE_BODY
//闪电位置
leftPoint = specWidthSize / 2