自定义CustomRatingBar控件

通过自定义RatingBar的样式实现⭐️⭐️⭐️指示器的方式功能过于受限,而且显示的样式阴影会受到影响。

系统自带显示:
在这里插入图片描述
自定义样式:
在这里插入图片描述

因此简单自一个符合要求的 CustomRatingBar

  • 支持设置星星数量
  • 支持设置星星Rating(float)
  • 支持设置空显示
  • 支持设置半空显示
  • 支持设置全显示
  • 支持设置星星之间的间距
  • 支持设置星星的宽高

1. 创建自定义 RatingBar 类

首先,创建一个自定义的 RatingBar 类,继承自 View,并重写相关方法。

import android.content.Context
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import com.example.yourapp.Rclass CustomRatingBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private var starCount = 5 // 星星数量private var rating = 0f // 当前评分private var starSpacing = 0 // 星星间距private var starWidth = 0 // 星星宽度private var starHeight = 0 // 星星高度private var starEmptyDrawable: Drawable? = nullprivate var starHalfDrawable: Drawable? = nullprivate var starFullDrawable: Drawable? = nullinit {val a = context.theme.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar, 0, 0)try {starCount = a.getInteger(R.styleable.CustomRatingBar_starCount, starCount)rating = a.getFloat(R.styleable.CustomRatingBar_rating, rating)starSpacing = a.getDimensionPixelSize(R.styleable.CustomRatingBar_starSpacing, starSpacing)starWidth = a.getDimensionPixelSize(R.styleable.CustomRatingBar_starWidth, 0)starHeight = a.getDimensionPixelSize(R.styleable.CustomRatingBar_starHeight, 0)starEmptyDrawable = a.getDrawable(R.styleable.CustomRatingBar_starEmpty)starHalfDrawable = a.getDrawable(R.styleable.CustomRatingBar_starHalf)starFullDrawable = a.getDrawable(R.styleable.CustomRatingBar_starFull)} finally {a.recycle()}}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {val width: Intval height: Intif (starWidth > 0) {width = starWidth * starCount + starSpacing * (starCount - 1)} else {width = MeasureSpec.getSize(widthMeasureSpec)starWidth = (width - starSpacing * (starCount - 1)) / starCount}height = if (starHeight > 0) {starHeight} else {starWidth}setMeasuredDimension(width, height)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)if (starEmptyDrawable == null || starHalfDrawable == null || starFullDrawable == null) {return}for (i in 0 until starCount) {val starRating = rating - ival drawable = when {starRating >= 1 -> starFullDrawablestarRating >= 0.5 -> starHalfDrawableelse -> starEmptyDrawable}val left = i * (starWidth + starSpacing)val right = left + starWidthdrawable?.setBounds(left, 0, right, height)drawable?.draw(canvas)}}fun setRating(rating: Float) {this.rating = ratinginvalidate()}fun getRating(): Float = ratingfun setStarCount(starCount: Int) {this.starCount = starCountrequestLayout()invalidate()}fun getStarCount(): Int = starCountfun setStarSpacing(spacing: Int) {this.starSpacing = spacingrequestLayout()invalidate()}fun getStarSpacing(): Int = starSpacingfun setStarWidth(width: Int) {this.starWidth = widthrequestLayout()invalidate()}fun getStarWidth(): Int = starWidthfun setStarHeight(height: Int) {this.starHeight = heightrequestLayout()invalidate()}fun getStarHeight(): Int = starHeightoverride fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> {val newRating = (event.x / width * starCount).toInt() + 1setRating(newRating.toFloat())return true}}return super.onTouchEvent(event)}
}

2. 自定义属性

在 res/values/attrs.xml 文件中添加星星宽高的自定义属性:

<declare-styleable name="CustomRatingBar"><attr name="starCount" format="integer" /><attr name="rating" format="float" /><attr name="starSpacing" format="dimension" /><attr name="starWidth" format="dimension" /><attr name="starHeight" format="dimension" /><attr name="starEmpty" format="reference" /><attr name="starHalf" format="reference" /><attr name="starFull" format="reference" />
</declare-styleable>

3. 使用自定义 RatingBar

在你的布局文件中使用自定义的 CustomRatingBar 并设置星星宽高和间距:

<com.example.yourapp.CustomRatingBarandroid:id="@+id/customRatingBar"android:layout_width="wrap_content"android:layout_height="wrap_content"app:starCount="5"app:rating="3.5"app:starSpacing="8dp"app:starWidth="40dp"app:starHeight="40dp"app:starEmpty="@drawable/star_empty"app:starHalf="@drawable/star_half"app:starFull="@drawable/star_full" />

4. 在代码中设置星级、间距、宽度和高度

在你的 Activity 或 Fragment 中设置星级、星星间距、宽度和高度:

val ratingBar: CustomRatingBar = findViewById(R.id.customRatingBar)
ratingBar.setRating(4.0f)
ratingBar.setStarSpacing(16) // 设置星星间距为16像素
ratingBar.setStarWidth(60)   // 设置星星宽度为60像素
ratingBar.setStarHeight(60)  // 设置星星高度为60像素

这样就完成了一个支持设置星星数量、三种状态、星星之间间距以及星星宽高的自定义 RatingBar 指示器。

在这里插入图片描述

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

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

相关文章

NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)

模式定理&#xff08;Schema Theorem&#xff09; 模式定理&#xff08;Schema Theorem&#xff09;是遗传算法&#xff08;Genetic Algorithm, GA&#xff09;的重要理论基础&#xff0c;由约翰霍兰德&#xff08;John Holland&#xff09;在1975年提出。它描述了具有特定模式…

CSS mask-image 实现边缘淡出过渡效果

使用场景 在生产环境中&#xff0c;遇到一个需求&#xff0c;需要在一个深色风格的大屏页面中&#xff0c;嵌入 Google Maps。为了减少违和感&#xff0c;希望地图四边能够淡出过渡。 这里的“淡出过渡”&#xff0c;关键是淡出&#xff0c;而非降低透明度。 基于 Google Ma…

Tecplot安装error找不到指定模块之解决方案

最近有小伙伴反应&#xff0c;在安装Tecplot 2023版本时&#xff0c;参考教程来操作很顺利&#xff0c;但是在开启软件后&#xff0c;有一个error弹窗&#xff0c;内容如下&#xff1a; 随后用中英文翻译&#xff1a;找不到指定模块 同时&#xff0c;软件内部的Tool工具栏打不…

大路灯护眼灯有必要买吗?五款护眼大路灯推荐

大路灯护眼灯有必要买吗&#xff1f;许多消费者对护眼大路灯的了解不够&#xff0c;总是被不专业产品“耍”得团团转。就比如市面上很多声称用了眼睛就不近视的产品&#xff0c;实际上它们毫无专业技术沉淀&#xff0c;还疏于调校光线稳定性、光线均匀度等上百项核心参数&#…

基于IOT架构的数据采集监控平台!

LP-SCADA数据采集监控平台是蓝鹏测控推出的一款聚焦于工业领域的自动化数据采集监控系统&#xff0c; 助力数字工厂建设的统一监控平台。 为企业提供从下到上的完整的生产信息采集与集成服务&#xff0c;从而为企业综合自动化、工厂数字化及完整的"管控一体化”的解决方案…

校园水电费管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;宿舍信息管理&#xff0c;学生缴费管理&#xff0c;教师缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我的 开发系统…

抖音视频素材一般都从哪里找?抖音视频素材库分享

在浏览抖音时&#xff0c;你是否曾被那些内容丰富、制作精良的视频所吸引&#xff1f;这些视频背后的秘密其实非常简单——高质量的视频素材。优质素材能够让你的视频更加出彩。然而&#xff0c;许多抖音内容创作者在初期可能会困惑&#xff1a;这些视频素材究竟从哪里获取呢&a…

linux uos悬浮窗口置顶问题

问题背景 公司软件有一个功能&#xff0c;在PPT播放时&#xff0c;我们软件悬浮窗口需要在WPS幻灯片上层显示&#xff0c;方便客户操作按钮。在window 上我们设置了窗口的topmost 所以能够显示在最前面。如下图所示&#xff1a; 但是在软件适配国产操作系统Linux统信和麒麟在w…

推动未来的引擎:人工智能大模型的现状与发展

推动未来的引擎&#xff1a;人工智能大模型的现状与发展 一、引言 随着人工智能技术的迅速发展&#xff0c;人工智能大模型作为其中的重要组成部分&#xff0c;正逐渐成为推动科技进步的重要引擎。无论是在自然语言处理、计算机视觉&#xff0c;还是智能推荐等领域&#xff0…

Python酷库之旅-第三方库Pandas(061)

目录 一、用法精讲 236、pandas.Series.explode方法 236-1、语法 236-2、参数 236-3、功能 236-4、返回值 236-5、说明 236-6、用法 236-6-1、数据准备 236-6-2、代码示例 236-6-3、结果输出 237、pandas.Series.searchsorted方法 237-1、语法 237-2、参数 237-…

Kubernetes 学习记录

https://note.youdao.com/ynoteshare/index.html?idbc7bee305611b52d6900ba209a92bd4d&typenote&_time1694072007342 概览 K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“…

江科大/江协科技 STM32学习笔记P17

文章目录 一、TIM输入捕获输入捕获与输出比较的关系频率测量测频法测周法 输入捕获的电路异或门的执行逻辑 输入捕获通道主从触发模式输入捕获基本结构PWMI基本结构输入捕获模式测频率main.c 输入捕获模式测占空比main.c 一、TIM输入捕获 输入捕获与输出比较的关系 在输出比较中…

PMP--冲刺--易混概念

文章目录 十大知识领域一、整合管理项目管理计划与项目文件的区分&#xff1a; 二、范围管理三、进度管理赶工与快速跟进的区分&#xff1a;赶工增加资源&#xff0c;以最小的成本代价来压缩进度工期&#xff1b;快速跟进&#xff0c;将正常情况下按顺序进行的活动或阶段改为至…

秋招突击——算法训练——8/1——用友集团笔试

文章目录 引言正文小友的生产线个人实现参考实现 小友策划游戏人物个人实现参考实现 最佳工作任务安排个人实现参考实现 大众评分最高的一次旅程 总结 引言 今天晚上七点钟到九点钟是用友集团的笔试&#xff0c;作为今天算法练习的主要内容&#xff01;具体怎么样&#xff0c;…

Python练习2

文章目录 主要内容一.Python基础练习题1.密码验证合格程序代码如下&#xff08;示例&#xff09;: 2.两数之和代码如下&#xff08;示例&#xff09;: 3.字符个数统计代码如下&#xff08;示例&#xff09;: 总结 主要内容 Python基础练习题 一.Python基础练习题 1.密码验证合…

频率的工程测量01 - Rif算法的构造

1.原始文档 《用于正弦波频率估计的修正I-Rife算法》&#xff0c;王哲文&#xff0c;2024 DOI&#xff1a; 10. 16337/j. 1004‑9037. 2024. 02. 019 1.1 这篇论文所属的自科基金U21A20500&#xff1a;近5年所承担的重要科研项目表-智能感知系统与安全教育部重点实验室&#…

lua学习(1)

vscode打开c或者lua文件 插件显示禁用&#xff0c;怎么开启插件。 1. lua 字符串 单个引号和双引号都可变量的定义默认是全局的删除一个变量将其赋值为nil即可 如&#xff1a; bnilnil还可以对表中的数据进行删除&#xff0c;也可删除一个表只要变量不是nil&#xff0c;变…

c语言第七天笔记

作业题&#xff1a; 设计TVM&#xff08;地铁自动售票机&#xff09;机软件。 输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0…

Nat网络地址转换实验

一、实验拓扑 二、实验要求 三、实验思路 四、实验展示 1.接口IP配置 telnet路由器 r1 r2 r3 pc2 2.全网可达&#xff08;给边界路由器&#xff0c;私家路由器写上缺省 &#xff0c;还要用到nat地址转换&#xff0c;多对多一对多&#xff0c;端口映射&#xff09;因为左右…

华为LTC流程体系详解

LTC&#xff0c;全称Lead to Cash&#xff0c;中文翻译为从线索到现金&#xff0c;是一种企业运营管理思想&#xff0c;也是一个集成的业务流程。它涵盖了企业从接触客户到收到客户回款的整个流程&#xff0c;通过科学化管理&#xff0c;实现更高效地将线索客户转化为付费客户。…