首页 > 编程语言 >uniapp 小程序 五星评分精确到0.1

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

时间:2025-01-14 10:29:06浏览次数:3  
标签:canvasDraw uniapp canvas const 五星 0.1 return type Math

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

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

  2. 上组件

<template>
  <view class="container">
    <view class="canvas-wrap">
      <canvas
        type="2d"
        id="canvas"
        class="canvas"
        disable-scroll="true"
      ></canvas>
    </view>
  </view>
</template>
<script>
	
	// star style
	const ratingColor = '#CBB195';
	const starColor = '#fff';
	const borderColor = '#CBB195';
	const borderWidth = uni.upx2px(2);
	const height = uni.upx2px(24);
	const width = uni.upx2px(144);
	
	// star config
	const 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 = 72
	
export 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 = null
		this.percent = 0
		return {
			isDrawing: false, // 是否正在绘图
		}
	},
	created() {},
	beforeDestroy() {
		/** 销毁对象 */
		if (this.canvasDraw) {
			this.canvasDraw = null // 绘图对象
			this.canvasEle = null // canvas元素对象
			this.canvasNode = null 
		}
	},
	mounted() {
		/** 初始化 */
		let that = this
		setTimeout(()=>{
			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().pixelRatio
					this.canvasEle = ele
					this.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) / oneStarPercent
			gradient.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. 使用
<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的特性 开发工具显示有问题,真机不影响

标签:canvasDraw,uniapp,canvas,const,五星,0.1,return,type,Math
From: https://blog.csdn.net/weixin_45563734/article/details/143951359

相关文章

  • ijkplayer k0.11.9 发布了
    ijkplayerk0.11.9发布了,这是debugly同学决定开始维护ijkplayer以来,发布的第24个版本。适用于苹果三大平台:平台及版本CPU架构iOS11.0arm64、arm64_simulator、x86_64_simulatormacOS10.11arm64、x86_64tvOS12.0arm64、arm64_simulator、x86_64_sim......
  • oracle12.2.0.1交互快速部署脚本(shell)
    背景有些项目会用到oracle,以前大佬写的脚本不好用,拿来改一改,能用起来先,回头再适配更高版本的oracle。如果使用过程中有什么问题,还请批评指正。脚本#!/bin/bash####################Steup1Installoraclesoftware#####################script_name:oracle12.2.0.1_inst......
  • 0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?
    首先,我们直接计算这三个表达式的结果:0.1+0.2在JavaScript(一个常见的前端开发语言)中,这个表达式的结果是0.30000000000000004,而不是你可能期望的0.3。这是因为JavaScript使用64位浮点数表示数字,这导致某些十进制小数无法精确表示。当你尝试对这些不精确的数字进行算术运算时......
  • uniapp开发app、h5和微信小程序,8大好用的组件库推荐
    文章目录**1.uViewUI****2.TDesign(腾讯出品)****3.VarletUI****4.thor-ui****5.ColorUI****6.NutUI****7.VantWeapp****8.GraceUI****推荐选择****总结**在使用uni-app开发App、H5和微信小程序时,选择合适的组件库可以显著提升开发效率和用户体验。......
  • 使用uniapp实现一个生成奖状的功能,如何实现?
    使用uniapp实现一个生成奖状的功能,主要涉及到前端界面的设计、用户输入的处理以及奖状的动态生成。以下是一个基本的实现步骤:设计前端界面:使用uniapp的组件和样式系统,设计一个用户友好的界面,包括输入区域(如姓名、奖项名称等)和预览/生成奖状的按钮。确保界面在不同设备上(如手......
  • python+uniapp基于微信小程序的小区服务管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • python+uniapp基于微信小程序的实习生管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • 班迪录屏电脑软件 Bandicam v8.0.1.2512 绿色便携解锁版
    点击上方蓝字睿共享资源关注我前言Bandicam绿色便携版是一个很棒的视频录制软件,被很多人认为是世界上最好的三个视频录制工具之一。它的好处在于,即使你的电脑配置不是很高,或者你的电脑已经用了很多年,它都能运行得很顺畅。而且,当你用它来录制视频时,声音和画面会完美地同步,不会出......
  • Hive4.0.1集群安装部署(Hadoop版本为3.3.6)(详细教程)
    前置环境​​​Linux环境Zookeeper集群安装(详细教程)-CSDN博客HadoopHA高可用集群3.3.6搭建(详细教程)-CSDN博客MySQL8.0.40离线安装(详细教程)_mysql8.0.40ftp-CSDN博客Hadoop3.3.6官网下载链接地址部署规划服务器节点MetaStoreHiveServer2bigdata01√bigd......
  • 酷柚易汛生产管理系统uniapp+php
    生产管理系统,帮助企业数字化转型,打造智能工厂,专业为生产企业量身开发的一套完整的生产管理系统。主要包含以下模块:购货模块、生产模块、仓库模块、资料模块,可配合酷柚易汛进销存无缝衔接使用。提供全部无加密服务端和前端源代码,支持私有化部署。更新日志V1.2.51、新增供......