当前位置: 代码网 > it编程>App开发>Android > Android自定义电池组件实例代码(BatteryView)

Android自定义电池组件实例代码(BatteryView)

2025年09月23日 Android 我要评论
支持:xml 与代码动态设置电量(0–100)充电charging与快充fastcharging区分(闪电样式 + 动画)电量阈值自动配色:<20% 红、<50% 橙、≥

支持:

  • 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自定义电池组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com