国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android仿蘋果電量顯示

這篇具有很好參考價值的文章主要介紹了Android仿蘋果電量顯示。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

自定義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!!)

        //繪制當(dāng)前電量
        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() //基線中間點(diǎn)的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 //分格總數(shù)
        private const val BATTERY_HEADER_WIDTH = 8 //右邊電池頭寬度
    }
}

自定義中通過 Canvas.clipRect()函數(shù)裁剪圓角矩形,實(shí)現(xiàn)類似蘋果電量的半圓角半直角的效果。

電量監(jiān)聽

主界面代碼監(jiān)聽電量變化的廣播:

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) {
                //當(dāng)前電量
                val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
                //最大電池電量
                val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)
                //電池狀態(tài)
                val status: Int = intent.getIntExtra(BatteryManager.EXTRA_STATUS, 100)
                mBatteryView!!.setBatteryLevel(level)
            }
            }
        }
    }

    protected fun onDestroy() {
        unregisterReceiver(receiver)
        super.onDestroy()
    }
}

其中 BatteryManager.EXTRA_LEVEL為當(dāng)前電量;BatteryManager.EXTRA_SCALE為電池容量即最大電量(基本都為100);BatteryManager.EXTRA_STATUS為電池狀態(tài),以此判斷是否在充電狀態(tài)。

效果

電量100%時顯示如下:
仿ios電量顯示,自定義View,Kotlin,android,電量UI,電池電量,自定義View,Kotlin
小于等于10%為低電量,顯示預(yù)警色(可根據(jù)需要調(diào)節(jié)低電量閾值):
仿ios電量顯示,自定義View,Kotlin,android,電量UI,電池電量,自定義View,Kotlin
電量20%:
仿ios電量顯示,自定義View,Kotlin,android,電量UI,電池電量,自定義View,Kotlin
可通過 DRAW_PART_LINE 的布爾常量設(shè)置是否要分格并顯示分格線:
仿ios電量顯示,自定義View,Kotlin,android,電量UI,電池電量,自定義View,Kotlin
上述內(nèi)容默認(rèn)最大電量為100,可通過 setMaxLevel()方法設(shè)置最大電池容量。文章來源地址http://www.zghlxwxcb.cn/news/detail-516892.html

到了這里,關(guān)于Android仿蘋果電量顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • android 自定義車牌鍵盤(kotlin)

    android 自定義車牌鍵盤(kotlin)

    平時停車?yán)U費(fèi)都要填車牌號碼,就想著自己能不能也做個車牌鍵盤demo。 自定義車牌鍵盤能滿足(普通車牌,新能源,警車,軍車,領(lǐng)事館車,教練車以及特種車輛等車牌) 1、車牌前兩位默認(rèn)是:粵A 2、第一個控件,默認(rèn)是省份鍵盤 3、剩下控件,默認(rèn)是abc鍵盤 4、當(dāng)前輸入

    2024年02月16日
    瀏覽(24)
  • Android 自定義View 之 圓環(huán)進(jìn)度條

    Android 自定義View 之 圓環(huán)進(jìn)度條

    ??很多時候我們會使用進(jìn)度條,而Android默認(rèn)的進(jìn)度條是長條的,從左至右。而在日常開發(fā)中,有時候UI為了讓頁面更美觀,就需要用到圓環(huán)進(jìn)度條,那么本文就是通過自定義寫一個圓環(huán)進(jìn)度條,首先看一下效果圖: ??關(guān)于自定義View的基礎(chǔ)知識就不再做過多的講解了,我

    2024年02月10日
    瀏覽(18)
  • Android:繪制自定義View人臉識別框

    Android:繪制自定義View人臉識別框

    項(xiàng)目開發(fā)需要自定義View實(shí)現(xiàn)一個人臉框,代碼實(shí)現(xiàn)很平常,一些細(xì)節(jié)記錄一下,方便以后查閱。 代碼實(shí)現(xiàn): FaceView.java 注意: 這里我把FaceView的layout_width、layout_height都設(shè)置成了\\\"match_parent\\\" 這里面有個 坑 容易踩到 本次開發(fā)時,xml中FaceView控件往上一直到第一層父布局寬、高

    2024年02月09日
    瀏覽(21)
  • Android 自定義View 之 Dialog彈窗

    Android 自定義View 之 Dialog彈窗

    ??在日常開發(fā)中用到彈窗是比較多的,常用于提示作用,比如錯誤操作提示,余額不足提示,退出登錄提示等,還有用于數(shù)據(jù)展示的彈窗,上拉彈窗等等,主要為了簡化在日常開發(fā)中的使用。 ??Android中的Dialog彈窗是一種用于展示特定信息或者在用戶需要進(jìn)行某些操作時

    2024年02月16日
    瀏覽(23)
  • Android 自定義View之圓形進(jìn)度條

    Android 自定義View之圓形進(jìn)度條

    很多場景下都用到這種進(jìn)度條,有的還帶動畫效果, 今天我也來寫一個。 寫之前先拆解下它的組成: 底層圓形 上層弧形 中間文字 那我們要做的就是: 繪制底層圓形; 在同位置繪制上層弧形,但顏色不同; 在中心點(diǎn)繪制文本,顯示進(jìn)度。 按照這個目標(biāo),學(xué)習(xí)下自定義Vi

    2024年02月09日
    瀏覽(23)
  • Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫系統(tǒng)的觸摸時間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月12日
    瀏覽(17)
  • [Android]自定義RecyclerView中View的動畫

    官方有一個默認(rèn)Item動畫類DafaultItemAnimator,其中 DefaultItemAnimator 繼承了SimpleItemAnimator 繼承了 RecyclerView.ItemAnimator SimpleItemAnimator 它是一個包裝類,用來判斷當(dāng)前的ViewHolder到底是執(zhí)行移動、移除、添加或者改變等行為。 DefaultItemAnimator 是執(zhí)行具體動畫類,它負(fù)責(zé)將viewHolder初始化

    2024年02月11日
    瀏覽(18)
  • Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一)

    Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫系統(tǒng)的觸摸時間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月17日
    瀏覽(22)
  • Android 自定義View實(shí)戰(zhàn)—制作一個簡易輸入框

    Android 自定義View實(shí)戰(zhàn)—制作一個簡易輸入框

    這次我們來做一個簡易輸入框,可以用于密碼輸入和驗(yàn)證碼輸入。 依然在EasyView中進(jìn)行創(chuàng)建,在 com.easy.view 下新建一個 EasyEditText ,繼承自 View ,實(shí)現(xiàn)里面的構(gòu)造方法。 ① 構(gòu)造方法 然后我們繼承自 View ,重寫里面的構(gòu)造方法,代碼如下: 下面就可以增加樣式了。 ② XML樣式

    2024年02月10日
    瀏覽(23)
  • Android音視頻剪輯器自定義View實(shí)戰(zhàn)!

    Android音視頻剪輯器自定義View實(shí)戰(zhàn)!

    Android音視頻剪輯器自定義View實(shí)戰(zhàn)! - 掘金 ? Android音視頻剪輯器自定義View實(shí)戰(zhàn)! - 掘金 話不多說,先上一個代碼完成效果。 動圖好像錄成橫屏的了,也沒找到調(diào)整反轉(zhuǎn) GIF 的位置,下面再補(bǔ)一張?jiān)O(shè)計(jì)稿靜態(tài)圖吧 最近這幾年音視頻應(yīng)用越來越廣泛,隨之而來的音視頻相關(guān)的需

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包