it编程 > App开发 > Android

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

20人参与 2025-09-23 Android

支持:

  • 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>

术语说明:

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、常见问题(结合你之前的疑问)

6、小扩展(可选)

到此这篇关于android自定义电池组件(batteryview)的文章就介绍到这了,更多相关android自定义电池组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Android开发教程之屏幕变更事件

09-28

Android 自定义Binding Adapter实战应用及作用详解

09-28

Android实现获取当前时间并转为时间戳

09-30

Nexus配置npm私有仓库全过程

09-14

使用Android获取手机已安装应用程序的不同方法

09-14

Android 中的 mk 和 bp 文件编译示例详解

10-10

猜你喜欢

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

发表评论