自定义VIEW之SeekBar

news2025/2/27 8:13:44

先放效果

 实现代码

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.core.graphics.toRectF
import com.calendar.master.gp.listener.ISelectTextSizeListener
import com.calendar.master.gp.utils.dp
import com.calendar.master.gp.utils.sp


class CustomSeekBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr){

    private var curWidth : Int = 1
    private var curHeight : Int = 1
    // 定义背景画笔
    private val mBgPaint by lazy {
        Paint().apply {
            isDither = true
            isAntiAlias = true
            style = Paint.Style.FILL
            color = Color.parseColor("#FFF4F4F5")
        }
    }

    // 定义Thumb背景
    private val mCirclePaint by lazy {
        Paint().apply {
            isDither = true
            isAntiAlias = true
            style = Paint.Style.FILL
            color = Color.WHITE
        }
    }

    // 定义文本画笔
    private val mTextPaint by lazy {
        Paint().apply {
            isDither = true
            isAntiAlias = true
            color = Color.parseColor("#FF020202")
            textSize = 12f.sp
        }
    }

    var iListener : ISelectTextSizeListener? = null

    private val mBgRect = Rect()

    private val mLeftRect = Rect()
    private val mRightRect = Rect()

    private var baseLine : Float = 1f
    private var textInputWidth : Float = 1f

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        curWidth = width
        curHeight = height
        mBgRect.set(0, 0, width, height)
        mLeftRect.set(0,0, height, height)
        mRightRect.set(width - height, 0, width, height)
        maxX = width - minX

        val fontMetrics = mTextPaint.fontMetrics
        baseLine = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom
        textInputWidth = mTextPaint.measureText("10")
    }

    private var minX = 15f.dp
    private var maxX = 15f.dp

    private var radius = 13f.dp

    private var curProgressX = minX

    private var curTextSize = 10

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        mTextPaint.color = Color.parseColor("#FF020202")
        // 绘制带圆角的背景
        canvas?.drawRoundRect(mBgRect.toRectF(), 15f.dp, 15f.dp, mBgPaint)
        // 绘制左边起点的文本
        canvas?.drawText("10", mLeftRect.width()/2f - textInputWidth/2f, mLeftRect.height()/2 + baseLine, mTextPaint)
        // 绘制右边终点的文本
        canvas?.drawText("48", mRightRect.left.toFloat() + mRightRect.width()/2f - textInputWidth/2f, mLeftRect.height()/2 + baseLine, mTextPaint)
        mTextPaint.color = Color.parseColor("#FFF28989")
        // 绘制Thumb的背景
        canvas?.drawCircle(curProgressX, 15f.dp, radius, mCirclePaint)
        // 绘制Thumb的文字
        canvas?.drawText("$curTextSize", curProgressX - textInputWidth/2f, mLeftRect.height()/2 + baseLine, mTextPaint)
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        when(event?.action) {
            MotionEvent.ACTION_DOWN -> {

            }
            MotionEvent.ACTION_MOVE -> {
                if(event.x in minX..maxX) {
                    curProgressX = event.x
                    curTextSize = if(event.x == maxX) {
                        48
                    }else {
                        (((curProgressX - 15f.dp) / (curWidth - 30f.dp)) * 39).toInt() + 10
                    }
                }
            }
            MotionEvent.ACTION_UP -> {

            }
        }
        iListener?.textSize(curTextSize)
        invalidate()
        return true
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团增量数仓建设新进展

摘要:本文整理自美团系统研发工程师汤楚熙,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 1. 建设背景 2. 核心能力设计与优化 3. 业务实践 4. 未来展望 Tips:点击「阅读原文」免费领取 5000CU*小时…

解决 泛型类型转换出现Unchecked cast: ‘java.lang.Object‘ to ‘T‘怎么解决

文章目录 解决 泛型类型转换出现Unchecked cast: java.lang.Object to T怎么解决场景复现如何解决如何应用demo案例说明 解决 泛型类型转换出现Unchecked cast: java.lang.Object to T怎么解决 场景复现 自定义工具类,编写公共方法,根据不同日期类型&a…

动规算法题:打家劫舍Ⅱ

题目链接:打家劫舍Ⅱ 题目分析 状态表示 从题目分析中可以得知,是有偷和不偷的情况,因此根据做题经验,就使用两个数组来对应着两个情况。 状态转移方程 ①当选择偷第i个位置,那就意味着第i-1个位置的值是不能偷的&a…

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)(简称 MP)是一个 MyBatis(opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入&#…

大项与小项

小项 n个命题变元的简单合取式,称作小项,其中每个命题变元与它的否定不能同时存在,但每个命题变元必须出现且仅出现一次。 n个命题变元的小项有2^n个 小项的编码:mi,其中i是使得小项等于1的一组指派的二进制表示。 大项…

英飞凌 Tc3xx AURIX 2G多核处理器简介

目录 1、概述 2、AURIX 2G多核架构 2.1、多核简介 2.2、片上总线简介 3、AURIX 2G内核简介 3.1、内核架构 3.2、内核寄存器 3.3、中断处理 4、AURIX 2G内存简介 4.1、内存简介 4.2、内存映射 1、概述 该产品具备多达六核的高性能架构,每个内核的时钟频率最高可达 30…

基于java+swing俄罗斯方块

基于javaswing俄罗斯方块 一、系统介绍二、功能展示三、其他系统实现五、获取源码 一、系统介绍 项目类型:Java SE项目(awtswing)非开源 项目名称:俄罗斯方块(Tertis) 主要技术:java、awt、swing等技术 …

CSDN首页消息发布文章topSpInfo

Java 这东西就是纯粹的概念,而且很多公司还喜欢拿着这个不停的问。 我们平常写的 Class 就是对象。 New 就是把这个 Class 实例化,实例化啥意思,就是在内存中分配空间呗,不实例化,数据存哪里呀。 这里就是有个奇葩的…

错题整理——测开2021网易

1. 某些bug不影响使用时,可以选择先上线,在维护过程中修复。 2. df:查看磁盘使用情况 dir不是linux的常用的命令,不过用dir能够罗列出目录内容;dir默认没有颜色的区别,但也可以设置。现在都使用ls来代替。…

详细手机代理IP配置

嗨,亲爱的朋友们!作为一家代理产品供应商,我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时,常常会遇到一些IP限制的问题。别担心!今天我要给大家分享一下手机IP代理的设置方法,让你们轻松应对这些限…

【C++STL基础入门】string迭代器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、迭代器是什么?二、string迭代器1.定义迭代器理解 2.通过迭代器遍历遍历方式1遍历方式2 3.迭代器失效4.涉及到的迭代函数1、begin()2、end()3、a…

element 图标变颜色和更改大小

需求效果: element自带颜色不符合,且大小不一致。 // 穿透更改图标大小 /deep/ i.el-icon-info{font-size: 20px;} 颜色变化:

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构,那么对于同一种服务,当然不可能只有一个节点,需要部署多个节点 架构图如下: 由上可以看出存在多个同一种服务提供者(Service Provider) 搭建服务提供者集…

基于Python的图书馆大数据可视化分析系统设计与实现

博主介绍:✌csdn特邀作者、博客专家、java领域优质创作者、博客之星,擅长Java、微信小程序、Python、Android等技术,专注于Java、Python等技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 …

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复?数据丢失是一种让人非常头疼的问题,尤其是当我们的U盘数据丢失了,但内存仍然被占用时,更令人困惑和焦虑。然而,不要慌张!在本文中,将为大家介绍一些有效的方法来恢…

STM32F4X 定时器PWM

STM32F4X 定时器PWM 什么是PWMSTM32F4X PWM使用GPIO引脚复用STM32F4X PWM配置参数定时器PWM输出通道定时器PWM输出模式定时器PWM有效电平定时器PWM工作过程定时器PWM频率计算 STM32F4X PWM配置步骤STM32F4X PWM配置函数 上节说到了定时器的定时功能,这节说一下定时器…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式,包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中,我们将考虑为什么有这么多不同的格式,探讨 3D 文件格式存储的四…

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘c

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

C++ 二叉搜索树的概念特性

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 : 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大…

华为云部署JDK环境

一、确定系统内核 在下载jdk之前要先确定自己的内核是什么版本,因为我选的云服务器是CentOS7,所以一定是Linux_86_64版本。 若不确定可以在命令行中输入“uname -a”来查看系统内核。 二、下载JDK 到官网下载对应统信系统版本的jdk安装包 jdk官网&…