IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android-自定义电量 View -> 正文阅读

[移动开发]Android-自定义电量 View

最近,app中要显示一个状态栏,包含,网络状态,时间和电量状态

想偷个懒,找个自定义电量项目,找了半天,没有想要的效果

只能,自己手动写一个了

代码比较简单:



import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.util.Log
import android.view.View
import androidx.core.content.ContextCompat
import com.lantu.demo.R
import kotlin.properties.Delegates

/**
 * 创建日期:2021/12/8 13:21
 * 包名: com.lantu.demo.view
 * @author queyl
 * 类说明:
 *
 */
class BatteryView(mContext: Context?, attrs: AttributeSet?, defStyleAttr: Int) :
    View(mContext, attrs, defStyleAttr) {

    companion object {
        val TAG = BatteryView::class.java.simpleName
        val Header_Height_Percent = 0.35f
        val Header_Width_Percent = 0.1f
        val Max_Power = 100
        val Inside_margin = 3
        val stokeWidth = 2f
        val redius = 4f
    }

    private lateinit var paintBorder: Paint
    private lateinit var paintFill: Paint
    private lateinit var paintFillCharging: Paint

    // 头部尺寸
    private var headerHeight: Float = 0f
    private var headerWidth: Float = 0f

    //电量
    private var mPower = 100

    //是否在充电
    private var isCharging = false



    private var lowerPower:Int = 20
    private var chargingDrawable: Int =  R.drawable.charging_2
    private var lowColor: Int = R.color.red_f00
    private var chargingColor: Int = R.color.green_0f4
    private var defaultColor: Int = R.color.black


    @SuppressLint("ResourceAsColor")
    @JvmOverloads
    constructor(context: Context?, attrs: AttributeSet? = null) : this(context, attrs, 0) {

        val ta = context?.obtainStyledAttributes(attrs, R.styleable.BatteryView)
        if (ta != null) {
            chargingDrawable = ta.getResourceId(R.styleable.BatteryView_charging_image, R.drawable.charging_2)
            lowColor = ta.getResourceId(R.styleable.BatteryView_low_power_color, R.color.red_f00)
            chargingColor = ta.getResourceId(R.styleable.BatteryView_charging_color, R.color.green_0f4)
            defaultColor = ta.getResourceId(R.styleable.BatteryView_default_color, R.color.black)
            lowerPower = ta.getInteger(R.styleable.BatteryView_low_power, 20)
        }
        ta?.recycle()

        initPaint()
    }

    private fun initPaint() {

        //先画外框
        paintBorder = Paint()
        paintBorder.color = Color.BLACK
        paintBorder.strokeWidth = stokeWidth
        paintBorder.isAntiAlias = true
        paintBorder.style = Paint.Style.STROKE

        //内部电量
        paintFill = Paint()
        paintFill.isAntiAlias = true
        paintFill.style = Paint.Style.FILL

        //内部电量-充电中
        paintFillCharging = Paint()
        paintFillCharging.color = ContextCompat.getColor(context, chargingColor)
        paintFillCharging.isAntiAlias = true
        paintFillCharging.style = Paint.Style.FILL
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        if (changed) {
            Log.d(TAG, " onLayout ==> left = ${left}, right = $right, top = $top, bottom = $bottom")
            headerHeight = (bottom - top) * Header_Height_Percent
            headerWidth = (right - left) * Header_Width_Percent
        }
    }


    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        //画电量边框
        val rect = RectF(
            0F, 0F,
            width - headerWidth, height.toFloat()
        );
        canvas?.drawRoundRect(rect, redius, redius, paintBorder)

        //画电池头
        val rect3 =
            RectF(width - headerWidth, (height / 2 - headerHeight / 2), width.toFloat(), height / 2 + headerHeight / 2)
        canvas?.drawRect(rect3, paintFill);

        val power_percent = (mPower * 1.0f / Max_Power)
        //画电量
        if (power_percent != 0F) {
            val p_left = 0 + Inside_margin
            val p_top = 0 + Inside_margin
            val p_right = p_left + ((width - headerWidth - Inside_margin - p_left) * power_percent)
            val p_bottom = height - Inside_margin
            val rect2 = RectF(p_left.toFloat(), p_top.toFloat(), p_right, p_bottom.toFloat())
            if (isCharging) {
                canvas?.drawRect(rect2, paintFillCharging)
                val options = BitmapFactory.Options()
                val chargingBitmap = BitmapFactory.decodeResource(resources, chargingDrawable, options)
                if ( chargingBitmap != null) {
                    val size = height- Inside_margin*2
                    canvas?.drawBitmap(
                        chargingBitmap,
                        Rect(0, 0, options.outWidth, options.outHeight),
                        RectF((width / 2 - size / 2f), Inside_margin.toFloat(), (width / 2 + size / 2f), height.toFloat()- Inside_margin),
                        paintBorder
                    )
                }
            } else {
                if (mPower<=lowerPower){
                    paintFill.color = ContextCompat.getColor(context,lowColor)
                }else{
                    paintFill.color = ContextCompat.getColor(context,defaultColor)
                }
                canvas?.drawRect(rect2, paintFill)
            }
        }

    }


    fun setPower(power: Int, charging: Boolean = false) {
        if (power < 0) {
            this.mPower = 0
        } else if (power > Max_Power) {
            mPower = Max_Power
        } else {
            mPower = power
        }
        this.isCharging = charging
        invalidate()
    }

}

其中用到的资源:

R.drawable.charging_2:

<color name="red_f00">#FF0000</color>
<color name="green_0f4">#00ff44</color>
<color name="black">#FF000000</color>

自定义属性:

<declare-styleable name="BatteryView">
    <attr name="default_color" format="reference|color"/>
    <attr name="charging_color" format="reference|color"/>
    <attr name="low_power_color" format="reference|color"/>
    <attr name="low_power" format="integer"/>
    <attr name="charging_image" format="reference"/>
</declare-styleable>

布局引用:

<com.test.demo.view.BatteryView
    android:id="@+id/battery"
    android:layout_width="40dp"
    android:layout_height="20dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    android:layout_marginTop="10dp"
    app:low_power_color="@color/red_f00"
    app:charging_color="@color/green_0f4"
    app:default_color="@color/black"
    app:charging_image="@drawable/charging_3"
    app:low_power="30"
    />

该自定义电量View主要功能有:

1.显示当前电量

2.显示是否在充电状态

3.设置低电量状态

如果你的需求不一样,或者有微差,自己考下代码,改动一下,比较简单

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:48:03  更:2021-12-09 11:49:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:45:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码