自定义VIEW之SeekBar

先放效果

 实现代码

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.spclass CustomSeekBar @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr){private var curWidth : Int = 1private var curHeight : Int = 1// 定义背景画笔private val mBgPaint by lazy {Paint().apply {isDither = trueisAntiAlias = truestyle = Paint.Style.FILLcolor = Color.parseColor("#FFF4F4F5")}}// 定义Thumb背景private val mCirclePaint by lazy {Paint().apply {isDither = trueisAntiAlias = truestyle = Paint.Style.FILLcolor = Color.WHITE}}// 定义文本画笔private val mTextPaint by lazy {Paint().apply {isDither = trueisAntiAlias = truecolor = Color.parseColor("#FF020202")textSize = 12f.sp}}var iListener : ISelectTextSizeListener? = nullprivate val mBgRect = Rect()private val mLeftRect = Rect()private val mRightRect = Rect()private var baseLine : Float = 1fprivate var textInputWidth : Float = 1foverride fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {super.onLayout(changed, left, top, right, bottom)curWidth = widthcurHeight = heightmBgRect.set(0, 0, width, height)mLeftRect.set(0,0, height, height)mRightRect.set(width - height, 0, width, height)maxX = width - minXval fontMetrics = mTextPaint.fontMetricsbaseLine = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottomtextInputWidth = mTextPaint.measureText("10")}private var minX = 15f.dpprivate var maxX = 15f.dpprivate var radius = 13f.dpprivate var curProgressX = minXprivate var curTextSize = 10override 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.xcurTextSize = 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.rhkb.cn/news/101750.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H3C 无线网络vlan pool架构案例三层组网web配置

实验的是目标就是要实现华为vlan pool那种应用, 整个园区发一种ssid信号,但是连接的客户端可以随机连上后进入不同的vlan,在这大型园区网非常有用。 这种方法也适合同一个ssid情况下,在不同的位置关联不同的vlan 开启自动固化、…

会议剪影|思腾合力受邀参加2023中国算力大会并作主题演讲

共享数字经济合作新机遇,携手开创算力产业新未来。8月18日-19日,由工业和信息化部、宁夏回族自治区人民政府主办的2023中国算力大会、第二届“西部数谷”算力产业大会在银川盛大启幕。思腾云计算总经理庞志刚、思腾合力市场总监徐莉受邀参会。 ▲思腾云计…

IDEA项目实践——Element UI概述

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring当中的切面AOP IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——动态SQL、关系映射、注解开发 IDEWA项目实践——mybatis的一些基本原理以及案例 文章目录 …

学习平台助力职场发展与提升

近年来,随着互联网技术的发展,学习平台逐渐成为了职场发展和提升的必备工具。学习平台通过提供丰富的课程内容、灵活的学习时间和个性化的学习路径,帮助职场人士更好地提升自己的技能和知识储备,为职场发展打下坚实的基础。 学习…

UML 类图

1、概述 目录 1、概述 1.1、UML概念 1.2、类图的概念 2、类的表示方式 2.1、普通类 2.2、抽象类 2.3、接口 3、类与类关系的表示 3.1、关联关系(Association) 3.1.1、单向关联 3.1.2、双向关联 3.1.3、自关联 3.2、聚合关系(aggre…

ElasticSearch简介、安装、使用

一、什么是ElasticSearch? Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监…

【python利用shp文件进行绘图白化】

python白化 白化的作用python实现 白化的作用 参考博文【matlab利用shp文件制作mask白化文件】 python实现 python借助shp文件对绘图进行白化,不需要进行mask文件的制作,可以高效地进行区域绘制 import numpy as np import cartopy.crs as ccrs impo…

【SpringSecurity】二、密码处理与获取当前登录用户

文章目录 一、密码处理1、加密方案2、BCryptPasswordEncoder类初体验3、使用加密码加密 二、获取当前登录用户1、方式一:通过安全上下文的静态调用2、方式二:做为Controller中方法的参数3、方式三:从HTTPServletRequest中获取4、方式四&#…

vim 常见操作

Vim 工作模式 1、vim 三种基本的工作模式 vim有三种基本的工作模式,分别为:命令模式、末行模式、编辑模式。关于这三种工作模式的介绍,请见下文。 1.1、命令模式 使用vim打开文件之后,首先进入命令模式,它是vim编辑…

一文学会使用ChatGPT API搭建自己的聊天网站

一文读懂如何搭建自己的ChatGPT聊天网站 在数字时代的浪潮下,人工智能正变得愈发令人惊叹和亲近。ChatGPT,就是这个变革的杰出代表。这项令人兴奋的技术将强大的自然语言处理能力带到您的指尖,让您能够以前所未有的方式与计算机进行互动。 …

【Redis从头学-8】Redis中的ZSet数据类型实战场景之用户积分榜

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Re…

回流焊炉温曲线图讲解

从下面回流焊炉温曲线标准图分析回流焊的原理: 当PCB进入升温区(干燥区)时,焊锡膏中的溶剂、气体蒸发掉,同时焊锡膏中的助焊剂润湿焊盘、元器件端头和引脚,焊锡膏软化、塌落、覆盖了焊盘,将焊盘…

部署FTP服务(二)

目录 2.访问FTP服务 1.使用ftp命令行工具 2.使用浏览器 3.使用FileZilla Client 3.Serv-U 1.定义新域 2.创建用户 4. windowsserver搭建ftp服务器 一、FTP工具 二、Windows资源管理器 三、IE浏览器访问 2.访问FTP服务 下面在一台装有Windows10操作系统的计算机中&#…

长胜证券:九成注册制公司选择上市标准一,牛股“双高”特征明显

新股注册制施行以来,新股公司可选的上市规范愈加多样化,不同板块、不同上市规范的新股公司亦呈现出不同特征,新股上市后不再呈现“套路化”的上涨行情,新股破发成为常态。数据显现,2022年全年及2023年以来,…

中小企业精细化仓库管理,WMS仓储管理系统必不可少

尽管传统中小企业的仓库管理并不需要建立大型全自动立体智能仓库,但为了确保企业运营的稳定性和后备支持,它们仍然需要在管理方面制定更多的标准和规范。而为了达到这些目标,WMS仓储管理系统解决方案是必不可少的。 中小企业WMS仓储管理系统…

SpringBoot 模板模式实现优惠券逻辑

一、计算逻辑的类结构图 在这张图里,顶层接口 RuleTemplate 定义了 calculate 方法,抽象模板类 AbstractRuleTemplate 将通用的模板计算逻辑在 calculate 方法中实现,同时它还定义了一个抽象方法 calculateNewPrice 作为子类的扩展点。各个具…

适合国内用户的五款ChatGPT插件

众所周知使用ChatGPT3.5需要使用魔法且不稳定,订阅ChatGPT4.0每月需要支付20美元,并且使用次数有限制。对于那些不想每年花费240美元(超过1500元人民币)来使用GPT4.0的朋友们来说,还有别的办法吗? 答案是&…

【C语言】位段,枚举和联合体详解

目录 1.位段 1.1 什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 3. 联合(共用体) 3.1 联合类型的定义 3.2 联合的特点 3.3 联合大小的计算 1.位段 1.1 什么是位段 位段的声明和结构体是类…

多线程——学习笔记 1

目录 多线程的了解多线程并行和并发的区别Java程序运行原理多线程程序实现的方式1.继承Thread2.实现Runnable 多线程(实现Runnable的原理)实现多线程两种方式的区别匿名内部类实现线程的两种方式获取线程名字和设置名字获取当前线程的对象——hread.currentThread()…

Docker拉取并配置Grafana

Linux下安装Docker请参考:Linux安装Docker 安装准备 新建挂载目录 /opt/grafana/data目录,准备用来挂载放置grafana的数据 /opt/grafana/plugins目录,准备用来放置grafana的插件 /opt/grafana/config目录,准备用来挂载放置graf…