Android仿苹果电量显示

这篇具有很好参考价值的文章主要介绍了Android仿苹果电量显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自定义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.View

class BatteryView : View {
    private var mMaxLevel = 100
    private var mLinePaint: Paint? = null
    private var mBatteryPaint: Paint? = null
    private var mRectPaint: Paint? = null
    private var mTextPaint: Paint? = null
    private var mRectF: RectF? = null
    private var mWidth = 0
    private var mHeight = 0
    private var mPerPartWidth = 0
    private var mBatteryLevel = 0
    private 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_COUNT
        mHeaderHeight = mHeight / 3
        setMeasuredDimension(mWidth, mHeight)
    }

    private fun init() {
        mLinePaint = Paint()
        mLinePaint!!.isAntiAlias = true
        mLinePaint!!.color = Color.WHITE
        mBatteryPaint = Paint()
        mBatteryPaint!!.isAntiAlias = true
        mBatteryPaint!!.color = Color.WHITE
        mRectPaint = Paint()
        mRectPaint!!.isAntiAlias = true
        mRectPaint!!.color = Color.GRAY
        mRectPaint!!.style = Paint.Style.FILL
        mTextPaint = Paint()
        mTextPaint!!.color = Color.BLACK
        mTextPaint!!.textSize = 50f
        mTextPaint!!.style = Paint.Style.FILL
        mTextPaint!!.textAlign = Paint.Align.CENTER
        mRectF = 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!!.fontMetrics
        val 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.FILL
        canvas.drawRect(mRectF!!, mRectPaint!!)
    }

    fun setBatteryLevel(level: Int) {
        mBatteryLevel = level
        if (level <= 10) {
            mBatteryPaint!!.color = Color.RED
        } else {
            mBatteryPaint!!.color = Color.WHITE
        }
        postInvalidate()
    }

    fun setMaxLevel(maxLevel: Int) {
        mMaxLevel = maxLevel
        postInvalidate()
    }

    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? = null
    protected 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%时显示如下:
仿ios电量显示,自定义View,Kotlin,android,电量UI,电池电量,自定义View,Kotlin
小于等于10%为低电量,显示预警色(可根据需要调节低电量阈值):
仿ios电量显示,自定义View,Kotlin,android,电量UI,电池电量,自定义View,Kotlin
电量20%:
仿ios电量显示,自定义View,Kotlin,android,电量UI,电池电量,自定义View,Kotlin
可通过 DRAW_PART_LINE 的布尔常量设置是否要分格并显示分格线:
仿ios电量显示,自定义View,Kotlin,android,电量UI,电池电量,自定义View,Kotlin
上述内容默认最大电量为100,可通过 setMaxLevel()方法设置最大电池容量。文章来源地址https://www.toymoban.com/news/detail-516892.html

到了这里,关于Android仿苹果电量显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 自定义车牌键盘(kotlin)

    平时停车缴费都要填车牌号码,就想着自己能不能也做个车牌键盘demo。 自定义车牌键盘能满足(普通车牌,新能源,警车,军车,领事馆车,教练车以及特种车辆等车牌) 1、车牌前两位默认是:粤A 2、第一个控件,默认是省份键盘 3、剩下控件,默认是abc键盘 4、当前输入

    2024年02月16日
    浏览(45)
  • Android 自定义View 之 Dialog弹窗

      在日常开发中用到弹窗是比较多的,常用于提示作用,比如错误操作提示,余额不足提示,退出登录提示等,还有用于数据展示的弹窗,上拉弹窗等等,主要为了简化在日常开发中的使用。   Android中的Dialog弹窗是一种用于展示特定信息或者在用户需要进行某些操作时

    2024年02月16日
    浏览(43)
  • Android:绘制自定义View人脸识别框

    项目开发需要自定义View实现一个人脸框,代码实现很平常,一些细节记录一下,方便以后查阅。 代码实现: FaceView.java 注意: 这里我把FaceView的layout_width、layout_height都设置成了\\\"match_parent\\\" 这里面有个 坑 容易踩到 本次开发时,xml中FaceView控件往上一直到第一层父布局宽、高

    2024年02月09日
    浏览(63)
  • Android 自定义View 之 圆环进度条

      很多时候我们会使用进度条,而Android默认的进度条是长条的,从左至右。而在日常开发中,有时候UI为了让页面更美观,就需要用到圆环进度条,那么本文就是通过自定义写一个圆环进度条,首先看一下效果图:   关于自定义View的基础知识就不再做过多的讲解了,我

    2024年02月10日
    浏览(46)
  • Android 自定义View之圆形进度条

    很多场景下都用到这种进度条,有的还带动画效果, 今天我也来写一个。 写之前先拆解下它的组成: 底层圆形 上层弧形 中间文字 那我们要做的就是: 绘制底层圆形; 在同位置绘制上层弧形,但颜色不同; 在中心点绘制文本,显示进度。 按照这个目标,学习下自定义Vi

    2024年02月09日
    浏览(44)
  • Android自定义View之游戏摇杆键盘实现(一),快手android面试经验

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的绘图函数 public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重写系统的触摸时间,判断触摸点在背景范围内还是背景范围外 @Override public b

    2024年04月12日
    浏览(46)
  • [Android]自定义RecyclerView中View的动画

    官方有一个默认Item动画类DafaultItemAnimator,其中 DefaultItemAnimator 继承了SimpleItemAnimator 继承了 RecyclerView.ItemAnimator SimpleItemAnimator 它是一个包装类,用来判断当前的ViewHolder到底是执行移动、移除、添加或者改变等行为。 DefaultItemAnimator 是执行具体动画类,它负责将viewHolder初始化

    2024年02月11日
    浏览(66)
  • Android自定义View之游戏摇杆键盘实现(一)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的绘图函数 public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重写系统的触摸时间,判断触摸点在背景范围内还是背景范围外 @Override public b

    2024年04月17日
    浏览(54)
  • Android 自定义View实战—制作一个简易输入框

    这次我们来做一个简易输入框,可以用于密码输入和验证码输入。 依然在EasyView中进行创建,在 com.easy.view 下新建一个 EasyEditText ,继承自 View ,实现里面的构造方法。 ① 构造方法 然后我们继承自 View ,重写里面的构造方法,代码如下: 下面就可以增加样式了。 ② XML样式

    2024年02月10日
    浏览(37)
  • Android音视频剪辑器自定义View实战!

    Android音视频剪辑器自定义View实战! - 掘金   Android音视频剪辑器自定义View实战! - 掘金 话不多说,先上一个代码完成效果。 动图好像录成横屏的了,也没找到调整反转 GIF 的位置,下面再补一张设计稿静态图吧 最近这几年音视频应用越来越广泛,随之而来的音视频相关的需

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包