重学 Android 自定义 View 系列(八):星星评分控件(RatingBar)

前言

本节实现一个常见的星星评分控件,广泛应用于各种评价类应用中,比如电影评分、商品评价等。难度不大,直接开搂!

最终效果如下:
在这里插入图片描述

1. 效果分析


  • 显示若干颗星星(默认为5颗,可根据属性配置)。
  • 可以通过点击和滑动星星来选择评分。

效果展示:

  • 默认显示N颗空星,点击或滑动时,选中的星星将变为填充状态

2. 技术实现


2.1 在 res/values/attrs.xml 文件中,定义属性。两张图片和星星的数量。

    <declare-styleable name="RatingBar"><attr name="starNormal" format="reference"/><attr name="starFocus" format="reference"/><attr name="gradeNumber" format="integer"/></declare-styleable>

2.2 设置控件的尺寸,确定控件大小

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 高度为一颗星星的高度,加上 padding 的高度int height = mStarNormalBitmap.getHeight() + getPaddingTop() + getPaddingBottom();// 宽度为星星数量 * 单颗星星的宽度int width = mStarNormalBitmap.getWidth() * mGradeNum;setMeasuredDimension(width, height);
}

2.3 绘制星星,mCurrentGrade 为当前用户选中的等级,用来确定绘制几颗实心星星。

@Override
protected void onDraw(Canvas canvas) {for (int i = 0; i < mGradeNum; i++) {if (mCurrentGrade > i) {// 绘制已选中的实心星星// drawBitmap 参数: @NonNull Bitmap bitmap, float left, float top, @Nullable Paint paintcanvas.drawBitmap(mStarFocusBitmap, i * mStarNormalBitmap.getWidth(), 0, null);} else {// 绘制未选中的空心星星canvas.drawBitmap(mStarNormalBitmap, i * mStarNormalBitmap.getWidth(), 0, null);}}
}

2.4 处理用户交互(重点)

这个控件的关键技术点就是处理触摸手势,这里只使用 MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVE,就能应付全部可能手势,不需要抬起动作,注意 最后 return true; 代表消费触摸,如果不为true,则 MotionEvent.ACTION_MOVE 行为不生效!

下图为安卓控件和屏幕的坐标相关介绍,这里主要使用的是event.getX() x坐标, 相对于当前控件的,这里先初步认识一下,以后会用到。

在这里插入图片描述

@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:float x = event.getX();  // 获取触摸位置的 x 坐标float grade = x / mStarNormalBitmap.getWidth() + 1; // 计算当前评分// 限制评分范围if (grade < 0) {grade = 0;}if (grade > mGradeNum) {grade = mGradeNum;}// 更新评分并刷新界面if (mCurrentGrade != (int) grade) {mCurrentGrade = (int) grade;invalidate();Log.i("TAG", "分数:" + mCurrentGrade);}break;default:break;}return true;
}

3. 最后


这里只是绘制星星评分最基础的步骤,比如,还有半颗星的评分,原理一样,感兴趣的可以自行拓展。再会!

源码及更多自定义View已上传Github:DiyView

另外给喜欢记笔记的同学安利一款好用的云笔记软件,对比大部分国内的这个算还不错的,免费好用:wolai

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

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

相关文章

【力扣热题100】—— Day3.相交链表

被你改变的那部分我&#xff0c;代替你&#xff0c;永远与我站在一起 —— 24.11.28 160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09;3.1 介绍&#xff1a…

cesium 3Dtiles变量

原本有一个变亮的属性luminanceAtZenith&#xff0c;但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…

Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源 源起 Java语言最初是由Sun Microsystems公司&#xff08;该公司于2009年被Oracle公司收购&#xff09;开发的一种编程语言。其创造者是詹姆斯高斯林&#xff08;James Gosling&#xff09;&#xff0c;他是一位加拿大计算机科学家。其前身名为Oak&#xff08;橡…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…

使用 Spring AI + Elasticsearch 让 RAG 变得简单

作者&#xff1a;来自 Elastic Laura Trotta 使用私人数据定制你的人工智能聊天机器人体验。 Spring AI 最近将 Elasticsearch 添加为向量存储&#xff0c;Elastic 团队为其提供了优化。我们很高兴展示使用 Spring AI 和 Elasticsearch 向量数据库&#xff08;vector database&…

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是 8GB/16GB/32GB 等&#xff0c;那这些内存空间…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel&#xff08;没有一次性将数据读取到内存…

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能&#xff0c;这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…

Linux中使用ping提示“未知的名称或服务”

Linux中使用ping提示“未知的名称或服务” 问题&#xff1a;在linux系统中使用ping、telnet命令提示“未知的名称或服务”或 bad address。以centos系统为例&#xff1a; 问题原因&#xff1a; 1、未安装ping服务 2、操作系统未设置DNS&#xff08;尝试ping IP地址&#xff0…

【C++】深入解析 using namespace std 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是 std&#xff1f;&#x1f4af;using namespace std; 的作用&#x1f4af;为什么需要 std 命名空间&#xff1f;&#x1f4af;using namespace std; 的优缺点优点缺点…

Android音频框架总结

1、AudioFlinger&#xff1a;接收多个APP的数据&#xff0c;合并下发&#xff1b;是策略的执行者&#xff0c;例如具体如何与音频设备通信&#xff0c;如何维护现有系统中的音频设备&#xff0c;以及多个音频流的混音如何处理等等都得由它来完 成。 AudioFlinger主要包含3个主…

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题&#xff1f;最近遇到挺多工业相机维修咨询这个不能触发拍照的案例&#xff0c;所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…

68000汇编实战01-编程基础

文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…

wsl2的Ubuntu18.04安装ros和anaconda

参考&#xff1a;超详细 WSL2 安装 ros 和 anaconda_wsl2安装anaconda-CSDN博客 一.安装ros 1. 更换系统源 输入 wget http://fishros.com/install -O fishros && . fishros 和上面的链接一样&#xff0c;依次输入5-2-1 2. 安装ros 输入 wget http://fishros.c…

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …

【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)

&#x1f5fa;️博客地图 &#x1f4cd;1、报错发现 &#x1f4cd;2、原因分析 &#x1f4cd;3、解决办法 &#x1f4cd;4、测试结果 1、报错发现 装好了CentOS操作系统&#xff0c;使用ssh远程登陆CentOS&#xff0c;出现如下告警信息&#xff1a; bash: 警告:setlocale…

【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈

目录 一、双向链表 定义类和封装函数以及测试样例如下&#xff1a; 注意事项&#xff1a; 二、循环链表 单循环列表的类和函数封装如下&#xff1a; 注意事项&#xff1a; 三、双向循环链表 结点类和双循环链表的定义部分 函数封装之判空和尾插 双循环链表遍历 双循…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接&#xff08;Cross&#xff09;、内连接&#xff08;Inner&#xff09;、自然连接&#xff08;Natural&#xff09;、外连接&#xff08;Outer&#xff09; 2. ORDER BY to produce ordered output 3. 聚合函数&#xff08;Aggregate Functio…