自定义View

自定义电池电量的 View如下:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.Viewclass BatteryView : View {private var mMaxLevel = 100private var mLinePaint: Paint? = nullprivate var mBatteryPaint: Paint? = nullprivate var mRectPaint: Paint? = nullprivate var mTextPaint: Paint? = nullprivate var mRectF: RectF? = nullprivate var mWidth = 0private var mHeight = 0private var mPerPartWidth = 0private var mBatteryLevel = 0private var mHeaderHeight = 0 //电池头部高度constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {init()}constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {init()}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)mWidth = MeasureSpec.getSize(widthMeasureSpec)mHeight = MeasureSpec.getSize(heightMeasureSpec)if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED|| MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {mWidth = 150}if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED|| MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {mHeight = 80}mPerPartWidth = (mWidth - BATTERY_HEADER_WIDTH) / PART_COUNTmHeaderHeight = mHeight / 3setMeasuredDimension(mWidth, mHeight)}private fun init() {mLinePaint = Paint()mLinePaint!!.isAntiAlias = truemLinePaint!!.color = Color.WHITEmBatteryPaint = Paint()mBatteryPaint!!.isAntiAlias = truemBatteryPaint!!.color = Color.WHITEmRectPaint = Paint()mRectPaint!!.isAntiAlias = truemRectPaint!!.color = Color.GRAYmRectPaint!!.style = Paint.Style.FILLmTextPaint = Paint()mTextPaint!!.color = Color.BLACKmTextPaint!!.textSize = 50fmTextPaint!!.style = Paint.Style.FILLmTextPaint!!.textAlign = Paint.Align.CENTERmRectF = RectF()}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)val batteryWidth = mWidth - BATTERY_HEADER_WIDTH//绘制电池背景mRectF!!.right = batteryWidth.toFloat()mRectF!!.bottom = mHeight.toFloat()canvas.drawRoundRect(mRectF!!, 20f, 20f, mRectPaint!!)//绘制当前电量canvas.save()canvas.clipRect(0, 0, batteryWidth * mBatteryLevel / mMaxLevel, mHeight) //裁剪矩形canvas.drawRoundRect(mRectF!!, 20f, 20f, mBatteryPaint!!)canvas.restore()if (DRAW_PART_LINE) {//绘制电池分格线for (i in 1 until PART_COUNT) {canvas.drawLine((mPerPartWidth * i).toFloat(),0f,(mPerPartWidth * i).toFloat(),mHeight.toFloat(),mLinePaint!!)}}//绘制电量文字val fontMetrics = mTextPaint!!.fontMetricsval top = fontMetrics.top //基线到字体上边框的距离val bottom = fontMetrics.bottom //基线到字体下边框的距离val baseLineY = (mRectF!!.centerY() - top / 2 - bottom / 2).toInt() //基线中间点的y轴canvas.drawText(mBatteryLevel.toString(),mRectF!!.centerX(),baseLineY.toFloat(),mTextPaint!!)//绘制右边电池头部mRectF!!.left = batteryWidth.toFloat()mRectF!!.top = (mHeight / 2 - mHeaderHeight / 2).toFloat()mRectF!!.right = (mRectF!!.left + BATTERY_HEADER_WIDTH).toFloat()mRectF!!.bottom = (mHeight / 2 + mHeaderHeight / 2).toFloat()mRectPaint!!.style = Paint.Style.FILLcanvas.drawRect(mRectF!!, mRectPaint!!)}fun setBatteryLevel(level: Int) {mBatteryLevel = levelif (level <= 10) {mBatteryPaint!!.color = Color.RED} else {mBatteryPaint!!.color = Color.WHITE}postInvalidate()}fun setMaxLevel(maxLevel: Int) {mMaxLevel = maxLevelpostInvalidate()}companion object {private const val DRAW_PART_LINE = false //是否绘制分格线private const val PART_COUNT = 4 //分格总数private const val BATTERY_HEADER_WIDTH = 8 //右边电池头宽度}
}

自定义中通过 Canvas.clipRect()函数裁剪圆角矩形,实现类似苹果电量的半圆角半直角的效果。

电量监听

主界面代码监听电量变化的广播:

class MainActivity : AppCompatActivity() {private var mBatteryView: BatteryView? = nullprotected fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_fullscreen)mBatteryView = findViewById(R.id.battery_view)val filter = IntentFilter()filter.addAction(Intent.ACTION_BATTERY_CHANGED)registerReceiver(receiver, filter)}private val receiver: BroadcastReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {if (intent.action!! == Intent.ACTION_BATTERY_CHANGED) {//当前电量val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)//最大电池电量val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)//电池状态val status: Int = intent.getIntExtra(BatteryManager.EXTRA_STATUS, 100)mBatteryView!!.setBatteryLevel(level)}}}}protected fun onDestroy() {unregisterReceiver(receiver)super.onDestroy()}
}

其中 BatteryManager.EXTRA_LEVEL为当前电量;BatteryManager.EXTRA_SCALE为电池容量即最大电量(基本都为100);BatteryManager.EXTRA_STATUS为电池状态,以此判断是否在充电状态。

效果

电量100%时显示如下:

小于等于10%为低电量,显示预警色(可根据需要调节低电量阈值):

电量20%:

可通过 DRAW_PART_LINE 的布尔常量设置是否要分格并显示分格线:

上述内容默认最大电量为100,可通过 setMaxLevel()方法设置最大电池容量。

Android仿苹果电量显示相关推荐

  1. android仿iphone页面,Android仿苹果关机界面实现代码

    本文实例为大家分享了Android仿苹果关机界面的具体代码,供大家参考,具体内容如下 主class 用来控制viewdialog的显示 package com.android.server.polic ...

  2. android 仿苹果 小组件,安卓玩烂的小组件 iOS怎么又给捡起来了?

    在所有用户的认知中,新系统区别于旧系统的第一印象永远是外观上的变化,例如iOS7的扁平化设计.iOS 10的控制中心.iOS 13的深色模式. 而在即将推出的iOS 14中,最直观的变化莫过于重新设计 ...

  3. android 仿苹果 小组件,仿ios14桌面小部件

    仿ios14桌面小部件,这是一款面向广大安卓手机用户推出的高仿iOS14桌面插件软件,大家可以使用这款软件快速完成自己想要的桌面显示,多种插件一键点击轻松完成设置过程,让大家体验到同款iOS14桌面强 ...

  4. android 仿苹果 小组件,安卓仿ios14桌面小部件

    安卓仿ios14桌面小部件,是一个可以让安卓手机的界面看起来像苹果界面的软件,功能非常强大,它可以提供多种不同主题的壁纸桌面,随心选择,设置后的效果还是非常不错的,很有高级感,操作简单,上手也很快. ...

  5. Android自定义电池电量显示组件(kotlin,java)

    最近产品研发需求需要显示在线设备的电池电量状态,然后UI给出的效果的图是这样的 于是就开始了自定义个,因为是项目特定的UI所以很多属性都没有直接抽取到styles里面了,直接上代码(因为项目是使用ko ...

  6. 仿苹果通知显示在图标右上角上

    您可能在遇到这样的需求时,通过搜索,看到了这篇文章.但是很抱歉,目前我也没有什么好的解决办法.而这个问题的提出,也是我的同事在偶然间提到的. 目前,我所见的小米在4.4以上的系统中提供了这样的功能,不 ...

  7. android仿苹果悬浮窗(自动停靠、随手指滑动、返回主屏幕)

    说明:本人写博客一来是为了方便日后查看项目,二来是希望能够和广大的程序猿相互交流学习,文章布局简单,如有嫌弃,请绕行,如有错误,请指出,谢谢. 实验环境:安卓6.0 魅族手机 悬浮窗主要有以下几个功能 ...

  8. Android仿苹果iphone数字锁屏解锁功能

    跟着我一起按步骤来做,保证你一学就会. 步骤如下: 一.先自定义一个键盘布局文件: 在项目res/xml目录下新建一个xml文件,比如number_only.xml [html] view plain ...

  9. Android仿苹果siri浮动控件

    实现原理是用WindowManager添加视图,生命周期可以不跟随某一页面或某一应用,可以全屏浮动(状态栏除外).只有一个主类FloatView.在应用中new一下就可以显示了. 需要添加权限:< ...

  10. android仿苹果滑动,Android开发仿IOS的滑动按钮

    释放双眼,带上耳机,听听看~! 项目结构 MainActivity public class MainActivity extends AppCompatActivity { @Override pr ...

最新文章

  1. excel中会计专用格式问题_解决方法
  2. SAP WM LT10事务代码的一个坑?
  3. 图像去重imagededup
  4. selenium自动化之鼠标操作
  5. OpenCV实战中:blender-feed(img_warped_s, mask_warped, corners[img_idx]);这里有异常的处理方法
  6. ajax请求_重复的ajax请求让人很受伤
  7. java变量不声明可以直接使用吗_我们可以在不使用Java进行初始化的情况下声明最终变量吗?...
  8. 4G手机网络通信是如何被黑客远程劫持的?
  9. mac下cocos2dx(带jsoncpp第三方库)编译为android项目心得
  10. 【caffe】基于CNN的年龄和性别检测
  11. 5.1 凸二次规划问题
  12. PS选中部分区域调整透明度
  13. vue高德地图H5定位及城市选择器控件实现详细教程
  14. 傻瓜式激活win10,真的太简单了,一个3.3M小软件只有一个激活按钮,点一下就激活了。
  15. 使用表格制作流量查询表
  16. Python中struct.pack()和struct.unpack()用法详细说明
  17. 小学数学第3册计算机教案,小学数学教案,小学数学教学设计
  18. 生活随记 - 2020国庆第七天
  19. 查看 android打包证书签名
  20. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部

热门文章

  1. 巨头的联盟链选择 | 直播实录
  2. 关于移动通信网络与互联网的关系
  3. css函数之重复的径向渐变
  4. 计算 x 的 n 次幂函数
  5. win10 隐藏图标
  6. Unity3D 2D贴图 与 帧动画
  7. 第三阶段应用层——1.5 数码相册—使用FreeType在LCD上显示单个字符
  8. [转] 大学的终结—1950年代初期的“院系调整”
  9. 学计算机推荐电脑,计算机专业笔记本电脑推荐
  10. 电脑重启bootmgr_解决电脑出现bootmgr is missing如何解决