uniapp 小程序 五星评分精确到0.1

news/2025/1/15 9:01:45/

uniapp 小程序 五星评分精确到0.1

  1. 上图
    在这里插入图片描述

  2. 上组件

javascript"><template><view class="container"><view class="canvas-wrap"><canvastype="2d"id="canvas"class="canvas"disable-scroll="true"></canvas></view></view>
</template>
<script>// star styleconst ratingColor = '#CBB195';const starColor = '#fff';const borderColor = '#CBB195';const borderWidth = uni.upx2px(2);const height = uni.upx2px(24);const width = uni.upx2px(144);// star configconst disabled = false;const starNum = 5;const step = 0.1;const toFixed = 1;const starGap = uni.upx2px(6);const oneStarPercent = 20;const oneStepPercent = 2;const starWidth = Math.floor((width - starNum * starGap) / starNum);const degree = 72export default {props:{score: {type: Number,default (){return 0}},// 总分为5时  type传1 // 总分为100时 type传2// 也可自定义总分type: {type: Number,default (){return 1}},ratingColor: {type: String,default (){return '#CBB195'}},starColor: {type: String,default (){return '#fff'}},borderColor: {type: String,default (){return '#CBB195'}},},data() {this.canvasDraw = null // 绘图对象this.canvasEle = null // canvas元素对象this.canvasNode = nullthis.percent = 0return {isDrawing: false, // 是否正在绘图}},created() {},beforeDestroy() {/** 销毁对象 */if (this.canvasDraw) {this.canvasDraw = null // 绘图对象this.canvasEle = null // canvas元素对象this.canvasNode = null }},mounted() {/** 初始化 */let that = thissetTimeout(()=>{that.$nextTick(()=>{that.initCanvas()})},300)},methods: {/** 初始化canvas */initCanvas() {const query = wx.createSelectorQuery().in(this)query.select('#canvas').fields({ node: true, size: true, rect: true }).exec((res) => {const ele = res[0]const pixelRatio = wx.getSystemInfoSync().pixelRatiothis.canvasEle = elethis.canvasNode = ele.node // wx的canvas节点this.canvasNode.width = ele.width * pixelRatio // 设置canvas节点宽度this.canvasNode.height = ele.height * pixelRatio // 设置canvas节点高度this.canvasDraw = this.canvasNode.getContext('2d')this.canvasDraw.scale(pixelRatio, pixelRatio)if(this.score){console.log(this.score)this.drawRate(this.score)}})},drawRate(value) {// 此处可根据自身的总分 计算五星比例  if(this.type == 2){value = (value/20).toFixed(1)}this.percent = value * oneStarPercent;for (let i = 0; i < starNum; i++) {this.drawStar({x: starWidth / 2 + i * (starWidth + starGap) + starGap / 2, y: height / 2, r: starWidth / 4, R: starWidth / 2, rot: 0, index: i})}},drawStar({x, y, r, R, rot, index}){const gradient = this.canvasDraw.createLinearGradient(x - R, 0 , x + R, 0)const stop = Math.min(Math.max((index + 1) * oneStarPercent - this.percent, 0), oneStarPercent)const rate = (oneStarPercent - stop) / oneStarPercentgradient.addColorStop(rate, this.ratingColor)gradient.addColorStop(Math.min(1, rate + 0.01), this.starColor)this.canvasDraw.beginPath();for (let i = 0; i < 360 / degree; i ++) {this.canvasDraw.lineTo( Math.cos( (18 + i*degree - rot)/180 * Math.PI) * R + x,-Math.sin( (18 + i*degree - rot)/180 * Math.PI) * R + y)this.canvasDraw.lineTo( Math.cos( (54 + i*degree - rot)/180 * Math.PI) * r + x,-Math.sin( (54 + i*degree - rot)/180 * Math.PI) * r + y)}this.canvasDraw.closePath();this.canvasDraw.lineWidth = borderWidth;this.canvasDraw.fillStyle = gradient;this.canvasDraw.strokeStyle = this.borderColor;this.canvasDraw.lineJoin = "round";this.canvasDraw.fill();this.canvasDraw.stroke();}},
}
</script>
<style>
.container {width: 144rpx;height: 24rpx;
}
.canvas-wrap {display: flex;height: 100%;/* background: #FFFFFF; */
}
.canvas {flex: 1;width: 100%;height: 100%;/* background: #FFFFFF; */
}
</style>
  1. 使用
javascript"><template>
<view class="star-box"><starRate v-if="score" :score="score" type="2"></starRate>
</view>
</template>
<script>
import starRate from './starRate.vue'
export default {components:{ starRate },data(){return {score:100}}
};
</script>
  1. 搞定!

注意 由于原生canvas的特性 开发工具显示有问题,真机不影响


http://www.ppmy.cn/news/1563279.html

相关文章

在 Alpine Linux 下通过 Docker 部署 PostgreSQL 服务器

简要介绍 Docker 是一个开源的容器化平台&#xff0c;它使得开发者能够轻松创建、部署和运行应用程序。通过使用 Docker&#xff0c;程序员可以把应用及其所有依赖打包在一个轻量级的容器中&#xff0c;这样可以确保在不同环境中的一致性。PostgreSQL&#xff08;简称 psql&am…

探索AI与鸿蒙开发新领域:从《星火AI使用指南》到《鸿蒙应用开发宝典》

探索AI与鸿蒙开发 前言AI智能化办公讯飞星火AI使用方法与技巧从入门到精通内容简介获取方式 鸿蒙HarmonyOS应用开发从入门到精通内容简介获取方式 总结 前言 在数字化的今天&#xff0c;科技的飞速发展让我们每天都在面临新的挑战和机遇。尤其是对于那些追求效率、寻求突破的职…

实景三维模型在智慧城市中的应用

在我国现代化社会发展的各个行业领域中&#xff0c;倾斜摄影测量技术和实景三维模型技术都得到了普遍的应用。尤其是在指挥城市建设工作中&#xff0c;利用这两项技术能够有效地提高数据的准确性和及时性&#xff0c;增强整个智慧城市建设的合理性&#xff0c;进而保证城市发展…

lombok在高版本idea中注解不生效的解决

环境&#xff1a; IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 问题描述 使用AllArgsConstructor注解一个用户类&#xff0c;然后调用全参构造方法创建对象&#xff0c;出现错误&#xff1a; java: 无法将类 com.itheima.pojo.User中的构造器 User应用到给定类型; 需要:…

Ubuntu-Install-Ros2

… redirect-from:: Installation/Linux-Install-Debians Installation/Ubuntu-Install-DebiansUbuntu (deb packages) … contents:: 目录 :depth: 2 :local: ROS 2 {DISTRO_TITLE_FULL} 的 deb 包目前可用于 Ubuntu Jammy (22.04)。 目标平台在 REP 2000 <https://ros.…

macOS 如何终止端口占用的进程 ?

您是否遇到过这样的情况&#xff1a;您试图在 Mac 上启动服务器或服务&#xff0c;却被告知端口已被占用&#xff1f;当您试图使用的端口被另一个进程占用时&#xff0c;就会出现此问题。在本教程中&#xff0c;我们将指导您完成在 macOS 上识别和终止这些进程的步骤&#xff0…

《零基础Go语言算法实战》【题目 4-1】返回数组中所有元素的总和

《零基础Go语言算法实战》 【题目 4-1】返回数组中所有元素的总和 请用 Go 语言编写一个函数&#xff0c;将整数数组作为输入并返回数组中所有元素的总和。 【解答】 package main import "fmt" func sumArray(array [5]int) int { sum : 0 for _, val : range…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下&#xff0c;节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…