uniapp使用canvas写环形进度条

这篇博客主要讨论了在uni-app中使用canvas2d绘制图形时遇到的问题,包括需要延迟执行draw()和stroke()才能生效,以及在微信开发者工具中canvas固定在屏幕上的异常现象。作者通过使用uni.createSelectorQuery().in(this)来正确获取组件内的canvas实例,并展示了如何绘制圆形轨道、进度条和文字的方法。问题在手机端表现正常,提示开发者注意在不同环境下进行适配测试。

遇到的坑

  1. 使用普通canvas需要延迟设置draw() stroke()才生效。
  2. 使用canvas2d在微信小程序的开发者工具上表现为固定在屏幕上,不随容器滚动,但是手机表现正常。
  3. 记住: 在组件中获取实例需要使用in(this)。如 const ctx = uni.createCanvasContext('myCanvas',this) const query = uni.createSelectorQuery().in(this)
    在这里插入图片描述

组件代码

<template>
  <div class="com-container">
    <canvas canvas-id="canvas" id="canvas" class="my-canvas" type="2d"></canvas>
  </div>
</template>

<script>
export default {
     
     
  props: {
     
     
    progress: {
     
     
      type: Number,
      default: 50
    },
    innerText: {
     
     
      type: String,
      default: '850'
    
uniapp使用canvas绘制可滑动环形进度条,可以通过以下步骤实现: 1. **创建canvas布**:在页面的wxml文件中创建一个canvas元素,并设置其宽高。 2. **获取canvas上下文**:在页面的js文件中,通过`uni.createCanvasContext`方法获取canvas的绘图上下文。 3. **绘制环形背景**:使用canvas的`arc`方法绘制环形背景。 4. **绘制环形进度**:根据进度值绘制环形进度。 5. **添加滑动功能**:通过监听触摸事件,实现滑动的功能,并动态更新进度值。 以下是一个简单的示例代码: **wxml文件**: ```html <view> <canvas canvas-id="circleCanvas" style="width: 200px; height: 200px;"></canvas> </view> ``` **js文件**: ```javascript Page({ data: { progress: 0 }, onReady: function () { this.drawCircle(); }, drawCircle: function () { const ctx = uni.createCanvasContext('circleCanvas', this); const startAngle = -0.5 * Math.PI; const endAngle = 1.5 * Math.PI; const centerX = 100; const centerY = 100; const radius = 80; // 绘制环形背景 ctx.beginPath(); ctx.arc(centerX, centerY, radius, startAngle, endAngle); ctx.lineWidth = 10; ctx.strokeStyle = '#e0e0e0'; ctx.stroke(); // 绘制环形进度 ctx.beginPath(); ctx.arc(centerX, centerY, radius, startAngle, startAngle + this.data.progress * 2 * Math.PI); ctx.lineWidth = 10; ctx.strokeStyle = '#1E90FF'; ctx.stroke(); ctx.draw(); }, touchStart: function (e) { this.startX = e.touches[0].pageX; }, touchMove: function (e) { const moveX = e.touches[0].pageX; const deltaX = moveX - this.startX; const maxProgress = 1; const minProgress = 0; let newProgress = this.data.progress + deltaX / 200; if (newProgress > maxProgress) { newProgress = maxProgress; } else if (newProgress < minProgress) { newProgress = minProgress; } this.setData({ progress: newProgress }, () => { this.drawCircle(); }); } }); ``` **说明**: 1. 在`onReady`生命周期函数中调用`drawCircle`方法绘制初始的环形进度条。 2. `drawCircle`方法中,首先绘制环形背景,然后根据`progress`值绘制环形进度。 3. 通过监听`touchStart`和`touchMove`事件,实现滑动的功能,并动态更新`progress`值。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值