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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 自定义SeekBar -> 正文阅读

[游戏开发]自定义SeekBar



```kotlin
package com.allynav.rtk.farm.view.ui

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.text.TextPaint
import android.util.AttributeSet
import android.util.TypedValue


class TextSeekBar : androidx.appcompat.widget.AppCompatSeekBar {
    constructor(context: Context?) : this(context, null) {
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context!!,
        attrs,
        defStyleAttr
    ) {
        initData()
    }

    var isShow = false

    // 画笔
    private var mPaint: Paint? = null

    // 进度文字位置信息
    private val mProgressTextRect: Rect = Rect()

    // 滑块按钮宽度
    private val mThumbWidth = dp2px(50f)

    private var mSeekBarMin = 0
//    fun TextThumbSeekBar(context: Context?) {
//        this(context, null)
//    }

//    fun TextThumbSeekBar(context: Context?, attrs: AttributeSet?) {
//        this(context, attrs, R.attr.seekBarStyle)
//        initData()
//    }

    private fun initData() {
        mPaint = TextPaint()
        (mPaint as TextPaint).isAntiAlias = true
        (mPaint as TextPaint).color = Color.WHITE // 画笔颜色
        (mPaint as TextPaint).textSize = sp2px(16f)

        // 如果不设置padding,当滑动到最左边或最右边时,滑块会显示不全
        setPadding(mThumbWidth / 2, 0, mThumbWidth / 2, 0)
    }

//    fun TextThumbSeekBar(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) {
//        super(context, attrs, defStyleAttr)
//    }

    @Synchronized
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // 进度文字位置信息
//        val progressText = "+$progress"
        val progressText = formatLongToTimeStr(progress.toLong())

        mPaint?.getTextBounds(progressText, 0, progressText.length, mProgressTextRect)

        // 进度百分比
        val progressRatio = progress.toFloat() / max
        // thumb偏移量
        val thumbOffset: Float =
            (mThumbWidth - mProgressTextRect.width()) / 2 - mThumbWidth * progressRatio
        val thumbX = width * progressRatio + thumbOffset
        //这里修改文字的范围,上或下
//        val thumbY: Float = height / 2f - mProgressTextRect.height() / 2f - dp2px(8f)
        val thumbY: Float = height / 2f - mProgressTextRect.height() / 2f
        mPaint?.let { canvas.drawText(progressText, thumbX, thumbY, it) }
        if (isShow) {
            invalidate()
            isShow = false
        }
    }

    fun setMix(min: Int) {
        mSeekBarMin = min
    }

    /**
     * dp转px
     *
     * @param dp dp值
     * @return px值
     */
    private fun dp2px(dp: Float): Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, dp,
            resources.displayMetrics
        ).toInt()
    }

    /**
     * sp转px
     *
     * @param sp sp值
     * @return px值
     */
    private fun sp2px(sp: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, sp,
            resources.displayMetrics
        ).toInt().toFloat()
    }

    /**
     * 时间转换
     */
    fun turnTime(timeNum: Long) {
    }

    /**
     * 时间转换&&毫秒数转时分秒
     * @param l Long
     * @return String
     */
    private fun formatLongToTimeStr(l: Long): String {
        var hour = 0;
        var minute = 0;
        var second = 0;
        second = l.toInt() / 1000;
        if (second > 60) {
            minute = second / 60;
            second %= 60;
        }
        if (minute > 60) {
            hour = minute / 60;
            minute %= 60;
        }
        return (getTwoLength(hour) + ":" + getTwoLength(minute) + ":" + getTwoLength(second));
    }

    /**
     * 时间不够时拼接0
     * @param data Int
     * @return String
     */
    private fun getTwoLength(data: Int): String {
        if (data < 10) {
            return "0$data";
        } else {
            return "" + data;
        }
    }


}


  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:35:02  更:2022-04-15 00:35:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 21:04:59-

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