最近产品研发需求需要显示在线设备的电池电量状态,然后UI给出的效果的图是这样的

于是就开始了自定义个,因为是项目特定的UI所以很多属性都没有直接抽取到styles里面了,直接上代码(因为项目是使用kotlin的,所以直接用kotlin进行编程了,当然也附带了Java版本的)

kotlin版本(里面用到的颜色值可自定义,这里是使用项目工具类转过来的):

package com.viewimport 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 = 20private var leftPoint = 0fprivate var topPoint = 0ffun setBattery(battery: Int) {this.battery = batteryinvalidate()}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_WIDTHoutlineRect.bottom = specHeightSize - OUTLINE_THICKNESS//设置电池盖矩形mCapRect.left = outlineRect.rightmCapRect.top = specHeightSize.toFloat() / 2 - CAP_HEIGHT / 2mCapRect.right = specWidthSize.toFloat()mCapRect.bottom = specHeightSize.toFloat() / 2 + CAP_HEIGHT / 2//设置电池体batteryRect.left = outlineRect.left + GAP_OF_SHAPE_BODYbatteryRect.top = outlineRect.top + GAP_OF_SHAPE_BODYbatteryRect.bottom = outlineRect.bottom - GAP_OF_SHAPE_BODY//闪电位置leftPoint = specWidthSize / 2 - OUTLINE_THICKNESS * 2topPoint = specHeightSize / 2 - OUTLINE_THICKNESS * 2fullPowerWidth = outlineRect.right - GAP_OF_SHAPE_BODY - batteryRect.leftsetMeasuredDimension(specWidthSize, specHeightSize)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)//设置电量矩形var batter = batteryif (batter < 0) {batter = 50}batteryRect.right = batter.toFloat() / 100 * fullPowerWidth + batteryRect.leftwhen {battery < 0 -> {batteryBodyPainter.color = ColorUtils.getColor(R.color.color_818283)batteryHeadPainter.color = ColorUtils.getColor(R.color.color_818283)mPowerPaint.color = ColorUtils.getColor(R.color.color_818283)}battery <= 20 -> {batteryBodyPainter.color = ColorUtils.getColor(R.color.color_818283)batteryHeadPainter.color = ColorUtils.getColor(R.color.color_FF4A37)mPowerPaint.color = ColorUtils.getColor(R.color.color_FF4A37)}battery <= 40 -> {batteryBodyPainter.color = ColorUtils.getColor(R.color.color_41D9B5)batteryHeadPainter.color = ColorUtils.getColor(R.color.color_41D9B5)mPowerPaint.color = ColorUtils.getColor(R.color.color_FF9037)}else -> {batteryBodyPainter.color = ColorUtils.getColor(R.color.color_2CBF6C)batteryHeadPainter.color = ColorUtils.getColor(R.color.color_2CBF6C)mPowerPaint.color = ColorUtils.getColor(R.color.color_2CBF6C)}}canvas.drawRoundRect(outlineRect,ROUND_CORNER_RADIUS,ROUND_CORNER_RADIUS,batteryBodyPainter)canvas.drawRoundRect(mCapRect, 1f, 1f, batteryHeadPainter)canvas.drawRoundRect(batteryRect, ROUND_CORNER_RADIUS, ROUND_CORNER_RADIUS, mPowerPaint)if (battery in 0..20) {val bitmap = ImageUtils.getBitmap(R.mipmap.shandian)canvas.drawBitmap(bitmap, leftPoint, topPoint, null)}}companion object {private const val OUTLINE_THICKNESS = 3.0f //电池框厚度private const val CAP_WIDTH = 2.0f //电池盖宽度private const val CAP_HEIGHT = 8.0f //电池盖高度private const val GAP_OF_SHAPE_BODY = 2.0f //电池体与外框之间的间隙private const val ROUND_CORNER_RADIUS = 2f//电池圆角}init {//电池外框batteryBodyPainter = Paint()batteryBodyPainter.color = ColorUtils.getColor(R.color.color_2CBF6C)batteryBodyPainter.isAntiAlias = truebatteryBodyPainter.style = Paint.Style.STROKEbatteryBodyPainter.strokeWidth = OUTLINE_THICKNESS//电池盖batteryHeadPainter = Paint()batteryHeadPainter.color = ColorUtils.getColor(R.color.color_FF0A0A)batteryHeadPainter.isAntiAlias = truebatteryHeadPainter.style = Paint.Style.FILL//电量mPowerPaint = Paint()mPowerPaint.isAntiAlias = truemPowerPaint.color = ColorUtils.getColor(R.color.color_3C83FA)mPowerPaint.style = Paint.Style.FILLoutlineRect = RectF()outlineRect.left = OUTLINE_THICKNESSoutlineRect.top = OUTLINE_THICKNESSmCapRect = RectF()batteryRect = RectF()}
}

Java版本:

package com.view;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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.blankj.utilcode.util.ResourceUtils;
import com.view.R;/*** @CreateDate: * @Author:lp* @Description:*/
public class BatteryView extends View {private static final float OUTLINE_THICKNESS = 3.0f;//电池框厚度private static final float CAP_WIDTH = 2.0f;//电池盖宽度private static final float CAP_HEIGHT = 8.0f;//电池盖高度private static final float GAP_OF_SHAPE_BODY = 2.0f;//电池体与外框之间的间隙private static final float ROUND_CORNER_RADIUS = 2;private float fullPowerWidth; //满电量时电池体的宽度。private int battery = 20;private Paint batteryBodyPainter;private Paint batteryHeadPainter;private Paint mPowerPaint;//电量画笔private RectF outlineRect;//电池矩形private RectF mCapRect;//电池盖矩形private RectF batteryRect;//电量矩形private int left;private int top;public BatteryView(Context context) {this(context, null);}public BatteryView(Context context, AttributeSet attrs) {super(context, attrs);//电池外框batteryBodyPainter = new Paint();batteryBodyPainter.setColor(ColorUtils.getColor(R.color.color_2CBF6C));batteryBodyPainter.setAntiAlias(true);batteryBodyPainter.setStyle(Paint.Style.STROKE);batteryBodyPainter.setStrokeWidth(OUTLINE_THICKNESS);//电池盖batteryHeadPainter = new Paint();batteryHeadPainter.setColor(ColorUtils.getColor(R.color.color_FF0A0A));batteryHeadPainter.setAntiAlias(true);batteryHeadPainter.setStyle(Paint.Style.FILL);//电量mPowerPaint = new Paint();mPowerPaint.setAntiAlias(true);mPowerPaint.setColor(ColorUtils.getColor(R.color.color_3C83FA));mPowerPaint.setStyle(Paint.Style.FILL);outlineRect = new RectF();outlineRect.left = OUTLINE_THICKNESS;outlineRect.top = OUTLINE_THICKNESS;mCapRect = new RectF();batteryRect = new RectF();}public void setBattery(int battery) {
//        this.battery = battery > 100 ? 100 : battery < 1 ? 1 : battery;this.battery = battery;invalidate();}public int getBattery() {return battery;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int specWidthSize = MeasureSpec.getSize(widthMeasureSpec);//宽int specHeightSize = MeasureSpec.getSize(heightMeasureSpec);//高//设置电池外框outlineRect.right = specWidthSize - OUTLINE_THICKNESS - CAP_WIDTH;outlineRect.bottom = specHeightSize - OUTLINE_THICKNESS;//设置电池盖矩形mCapRect.left = outlineRect.right;mCapRect.top = (float) specHeightSize / 2 - CAP_HEIGHT / 2;mCapRect.right = specWidthSize;mCapRect.bottom = (float) specHeightSize / 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;//闪电位置left = (int) (specWidthSize / 2 - OUTLINE_THICKNESS * 2);top = (int) (specHeightSize / 2 - OUTLINE_THICKNESS * 2);fullPowerWidth = outlineRect.right - GAP_OF_SHAPE_BODY - batteryRect.left;setMeasuredDimension(specWidthSize, specHeightSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//设置电量矩形int batter = battery;if (batter < 0) {batter = 50;}batteryRect.right = (float) batter / 100 * fullPowerWidth + batteryRect.left;if (battery < 0) {batteryBodyPainter.setColor(ColorUtils.getColor(R.color.color_818283));batteryHeadPainter.setColor(ColorUtils.getColor(R.color.color_818283));mPowerPaint.setColor(ColorUtils.getColor(R.color.color_818283));} else if (battery <= 20) {batteryBodyPainter.setColor(ColorUtils.getColor(R.color.color_818283));batteryHeadPainter.setColor(ColorUtils.getColor(R.color.color_FF4A37));mPowerPaint.setColor(ColorUtils.getColor(R.color.color_FF4A37));} else if (battery < 40) {batteryBodyPainter.setColor(ColorUtils.getColor(R.color.color_41D9B5));batteryHeadPainter.setColor(ColorUtils.getColor(R.color.color_41D9B5));mPowerPaint.setColor(ColorUtils.getColor(R.color.color_FF9037));} else {batteryBodyPainter.setColor(ColorUtils.getColor(R.color.color_2CBF6C));batteryHeadPainter.setColor(ColorUtils.getColor(R.color.color_2CBF6C));mPowerPaint.setColor(ColorUtils.getColor(R.color.color_2CBF6C));}canvas.drawRoundRect(outlineRect, ROUND_CORNER_RADIUS, ROUND_CORNER_RADIUS, batteryBodyPainter);canvas.drawRoundRect(mCapRect, 1, 1, batteryHeadPainter);canvas.drawRoundRect(batteryRect, ROUND_CORNER_RADIUS, ROUND_CORNER_RADIUS, mPowerPaint);if (battery >= 0 && battery <= 20) {Bitmap bitmap = ImageUtils.getBitmap(R.mipmap.shandian);canvas.drawBitmap(bitmap, left, top, null);}}
}

上面代码中使用到的闪电图片(当然也可以去矢量图库下载一个):

使用:在布局文件中:

<com.view.BatteryViewandroid:id="@+id/batteryVV"android:layout_width="26dp"android:layout_height="12dp"android:layout_marginTop="5dp" />

在代码中直接通过setBattery来设置电量(比如:batteryView.setBattery(50),设置电量为50%),因为项目需求,如果设备离线电池电量灰置(这里直接传入-1表示设备离线),如果低于20就需要增减红色闪电显示(这些都可以根据需要修改源代码),方便简洁,哈哈哈哈哈哈~

Android自定义电池电量显示组件(kotlin,java)相关推荐

  1. Android自定义View之电池电量显示

    自定义简单的电池电量显示.话不多说,直接上代码 package com.kimascend.thermometer.customview; import android.content.Context ...

  2. android 自定义控件 焦点,Android 自定义Button按钮显示样式(正常、按下、获取焦点)...

    现在的用户对APP的外观看得很重要,如果APP内所有元件都用Android默认样式写,估计下面评论里就有一堆在骂UI丑的.今天学习自定义Button按钮样式.Button样式修改的是Button的背景 ...

  3. Android 绘制电池电量图标(含充电状态)。

    Android 绘制电池电量图标在视频播放等全屏情况下有用到. 先在布局文件中写一个ImageView <?xml version="1.0" encoding=" ...

  4. Android自定义导览地图组件(一)

    丨版权说明 : <Android自定义导览地图组件(一)>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢.          鉴于Android关于自定义导览地图的相关资料以及 ...

  5. android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)

    本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...

  6. android自定义dialog不显示,Android 自定义的dialog显示不正常呢,怎么回事???

    Android 自定义的dialog显示不正常呢,怎么回事??? 用android的自定义布局文件: android:layout_width="match_parent" and ...

  7. Android自定义Textview 蒙语显示(蒙古文字)

    Android自定义Textview 蒙语显示(蒙古文字) 竖排Textview 自动换行 从左到右 蒙语字体包 demo下载地址 https://download.csdn.net/download ...

  8. 黑苹果中使用Config Configurator工具修复一些声卡和电池电量显示问题、隐藏多余引导、啰嗦模式

    黑苹果中使用Config Configurator工具修复一些声卡和电池电量显示问题.隐藏多余引导.啰嗦模式 好多人安装黑苹果之后没有声音.电池显示没有.引导太多.有啰嗦模式 我这里出了教程解决这些问 ...

  9. 安卓修改电池容量教程_安卓(Android)系统电池电量修改图文教程

    安卓( Android )系统电池电量修改图文教程 有机友不喜欢新 rom 的电池图标, 想要官方的原版电池 图标,也有机友想更换其他电池图标.为了方便想更换电池 图标的机友,发一个最简易的教程. 在 ...

最新文章

  1. 人类智慧的本质是什么?【知社视频】第118期
  2. 小米造车未有定论,鱼和熊掌可否兼得?
  3. 【laravel】docker 部署laravel 遇到的问题?
  4. python 发布啦!!
  5. Python快速定位工作目录
  6. 【Leetcode - 172】阶乘后的零(思维)
  7. ELK学习笔记之Kibana权限控制和集群监控
  8. 蚂蚁Service Mesh大规模落地实践与展望
  9. Leetcode每日一题:48.rotate-image(旋转图像)
  10. TensorFlow saved_model 模块
  11. 我是游戏设计师——《游戏设计艺术》
  12. MATLAB2017a安装破解教程
  13. 曼车仪表显示故障车载计算机,汽车仪表盘上的故障标志图解大全
  14. 苹果大中华区营收同比增48% iPhone销量翻番
  15. 计算机windows7桌面是指什么,在windows7中,桌面指的是什么
  16. 大数据工程师面试考题
  17. 【Unity小功能开发实战教程】制作跟随倒计时变化的进度条
  18. linux怎么设置wifi密码,技术|怎样在 Arch Linux 终端上更改 WiFi 密码
  19. jsp开发中cannot resolve taglib with uri的解决方法
  20. No browser is open都是什么鬼

热门文章

  1. shell实现DNA转录和翻译
  2. 回归模型拟合效果的判断(二)
  3. 【CSDN|每日一练】最长回文串
  4. 安卓手机刷linux超频内核,【图片】刷安卓7超频内核直飚1.84GHz,智能省电【荣耀畅玩4x吧】_百度贴吧...
  5. 编译安装samtools
  6. trex抓包过程详解
  7. java变量的类型转换基本知识_Java基础知识(一):注释、关键字、标识符、数据类型、常量、变量、数据类型转换...
  8. set 的常见用法详解(含定义)
  9. Kubuntu22.04如何使用Wallpaper Engine for Kde插件改善桌面
  10. 网络安全——常用的数据加密算法介绍