支持:
xml 与代码动态设置电量(0–100)
充电
charging与快充fastcharging区分(闪电样式 + 动画)电量阈值自动配色:<20% 红、<50% 橙、≥50% 绿
可配置边框/轨道/电量/闪电颜色;可显示百分比文本
支持无障碍(contentdescription、accessibilityliveregion)
支持状态保存(旋转/进程重建)
平滑动画过渡(setlevelanimated)
1、自定义属性res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="batteryview"> <attr name="bv_level" format="integer"/> <attr name="bv_showpercentage" format="boolean"/> <attr name="bv_charging" format="boolean"/> <attr name="bv_fastcharging" format="boolean"/> <attr name="bv_bordercolor" format="color"/> <attr name="bv_trackcolor" format="color"/> <attr name="bv_fillcolor" format="color"/> <attr name="bv_lowcolor" format="color"/> <attr name="bv_mediumcolor" format="color"/> <attr name="bv_highcolor" format="color"/> <attr name="bv_boltcolor" format="color"/> <attr name="bv_borderwidth" format="dimension"/> <attr name="bv_cornerradius" format="dimension"/> <attr name="bv_capwidth" format="dimension"/> <attr name="bv_capgap" format="dimension"/> <attr name="bv_textsize" format="dimension"/> </declare-styleable> </resources>
术语说明:
bordercolor:电池外框线条颜色。
trackcolor:电池内部“轨道/背景”颜色(未被电量填充区域)。
fillcolor:电量填充的基础颜色(当未启用分段阈值或外部强制指定时)。
2、 组件代码batteryview.kt
package com.yourpkg.widget
val y6 = t + h * 0.35f
boltpath.reset()
boltpath.moveto(x1, y1)
boltpath.lineto(x2, y2)
boltpath.lineto(x3, y3)
boltpath.lineto(x4, y4)
boltpath.lineto(x5, y5)
boltpath.lineto(x6, y6)
boltpath.close()
}
// endregion
// region — accessibility
private fun updatecontentdesc() {
val charge = when {
fastcharging -> "(快充中)"
charging -> "(充电中)"
else -> ""
}
contentdescription = "电量 $level%$charge"
}
// endregion
// region — state
override fun onsaveinstancestate(): parcelable? {
val superstate = super.onsaveinstancestate()
return savedstate(superstate).also {
it.level = level
it.charging = charging
it.fastcharging = fastcharging
it.showpercentage = showpercentage
it.chargepulse = chargepulse
}
}
override fun onrestoreinstancestate(state: parcelable?) {
val ss = state as? savedstate
super.onrestoreinstancestate(ss?.superstate ?: state)
ss?.let {
level = it.level
charging = it.charging
fastcharging = it.fastcharging
showpercentage = it.showpercentage
chargepulse = it.chargepulse
togglechargeanim(charging)
}
}
private class savedstate : basesavedstate {
var level: int = 0
var charging: boolean = false
var fastcharging: boolean = false
var showpercentage: boolean = false
var chargepulse: float = 0f
constructor(superstate: parcelable?) : super(superstate)
private constructor(inparcel: parcel) : super(inparcel) {
level = inparcel.readint()
charging = inparcel.readint() == 1
fastcharging = inparcel.readint() == 1
showpercentage = inparcel.readint() == 1
chargepulse = inparcel.readfloat()
}
override fun writetoparcel(out: parcel, flags: int) {
super.writetoparcel(out, flags)
out.writeint(level)
out.writeint(if (charging) 1 else 0)
out.writeint(if (fastcharging) 1 else 0)
out.writeint(if (showpercentage) 1 else 0)
out.writefloat(chargepulse)
}
companion object {
@jvmfield val creator: parcelable.creator<savedstate> = object : parcelable.creator<savedstate> {
override fun createfromparcel(source: parcel): savedstate = savedstate(source)
override fun newarray(size: int): array<savedstate?> = arrayofnulls(size)
}
}
}
// endregion
// region — utils
private fun dp(v: float) = v * resources.displaymetrics.density
private fun sp(v: float) = v * resources.displaymetrics.scaleddensity
// endregion
}3、xml 用法示例
<com.yourpkg.widget.batteryview android:id="@+id/battery" android:layout_width="120dp" android:layout_height="40dp" android:layout_margin="16dp" app:bv_level="45" app:bv_showpercentage="true" app:bv_charging="true" app:bv_fastcharging="false" app:bv_bordercolor="#222222" app:bv_trackcolor="#f2f2f2" app:bv_lowcolor="#e53935" app:bv_mediumcolor="#fb8c00" app:bv_highcolor="#43a047" app:bv_boltcolor="#ffffff" app:bv_borderwidth="2dp" app:bv_cornerradius="8dp" app:bv_capwidth="7dp" app:bv_capgap="2dp" app:bv_textsize="12sp"/>
4、代码控制示例
val bv = findviewbyid<batteryview>(r.id.battery) // 动态设置电量 bv.level = 18 // 立即刷新 bv.setlevelanimated(76) // 平滑动画到 76% // 充电状态 bv.charging = true // 显示闪电 + 呼吸动画 bv.fastcharging = true // 闪电更大、视觉更强 // 开关百分比 bv.showpercentage = false // 结合业务:阈值配色自动处理(<20 红、<50 橙、≥50 绿),无需额外代码
5、常见问题(结合你之前的疑问)
q:
bordercolor和trackcolor是什么?
a:bordercolor是外框线条;trackcolor是内部未充满的背景。q: 无障碍报错
isimportantforaccessibility?
a: 组件内已设置:importantforaccessibility = view.important_for_accessibility_yes
accessibilityliveregion = view.accessibility_live_region_polite
同时动态更新
contentdescription,读屏会播报“电量 76%,快充中”。q: 如何自定义颜色?
在 xml 传入bv_lowcolor/bv_mediumcolor/bv_highcolor,或在代码里直接修改。q: 性能如何?
组件绘制简单,动画为轻量级呼吸,postonanimation驱动,开销极低。
6、小扩展(可选)
电量渐变色:将
fillpaint设置为lineargradient,根据 level 动态改变 endx。低电量闪烁:level<10 且非充电时,使用
alpha在 120–255 之间脉动。rtl 适配:当
layoutdirection == layout_direction_rtl时从右向左填充(可根据需要调整fillrect计算)。
到此这篇关于android自定义电池组件(batteryview)的文章就介绍到这了,更多相关android自定义电池组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论