GraceLeeau
GraceLeeau
  • 发布:2020-02-26 16:03
  • 更新:2020-09-03 16:19
  • 阅读:14020

uni 如何获取canvas并动态设置其宽高

分类:uni-app

uni的canvas组件,其组件命名写法与Html5一致,但其编译后的H5版本,实际上对canvas组件进行了修改,大致为:

# 原  
<canvas canvas-id="my_canvas" class="my-canvas"></canvas>  
# 编译后H5版本  
<uni-canvas data-v-3cc3b8e9="" canvas-id="my_canvas" class="my-canvas">  
    <canvas width="600" height="300"></canvas>  
    <div style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; overflow: hidden;"></div>  
    <uni-resize-sensor><div><div></div></div><div><div></div></div></uni-resize-sensor>  
</uni-canvas>

以上为H5版本开发环境实际编译代码示例,Chrome模拟环境为iPhone6/7/8。

问题1: 查看该元素,可以看到其实际上在页面上的大小为300*150,与canvas组件上声明的宽高并不一致,且修改模拟环境为iPhoneX, 可以看到其倍数关系变为3倍。这意思是说,canvas的宽高单位不是px, 而是rpx ?

问题2: 那么若需要动态设置canvas的宽高,H5版本我该如何获取canvas并设置其宽高?
使用uni.createSelectorQuery() + selectorQuery.select(selector) + nodesRef.node(callback) 应该是获取canvas的方式,但此处nodesRef.node(callback) H5端是不支持的。
而使用:

// #ifdef H5  
let canvas = document.querySelector('.my-canvas > canvas')  
let ctx = canvas.getContext('2d')  
canvas.width = width  
canvas.height = height  
// #endif

却发现,实际效果上,canvas的宽高是显示了设置的值,然而这没有用,其实际显示尺寸依然是默认的300150,检查元素可看到uni-canvas, canvas均是默认的300150

求教,以uni canvas的模式,我该如何使用?

2020-02-26 16:03 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com

只能第一次载入动态赋值style样式修改大小,后面不能动态修改样式

<canvas :style="{width:canvasWidth +'px',height:canvasHeight +'px'}" style="background:#abcdef" canvas-id="firstCanvas" id="firstCanvas"></canvas>
1***@qq.com

1***@qq.com

我也求教,以uni canvas的模式,我该如何使用

  • GraceLeeau (作者)

    没有得到官方的回复,后面在H5端我是这样用的,不通过canvas.width/height来设置,而是给canvas设置变量控制其宽高样式,修改这个变量来达到想要修改canvas宽高的目的。

    我在遇到这个问题的项目中,总结了几点uni canvas H5端的注意事项,可以看看


    关于uni的canvas组件H5端需要注意的

    uni对于canvas在H5端的实现,做了大小重置,浏览器审查元素可以发现,设置的canvas style, 将应用在其外部的uni-canvas, 而内部实际的canvas的width, height,其数值为所设置大小的SystemInfo.pixelRatio倍,若未设置,则为默认的300px, 150px的SystemInfo.pixelRatio倍。因此,需要注意以下几点:


    动态设置canvas的大小,应通过其style来实现,而不要直接获取canvasEle,用canvasEle.width/height设置

    canvas动态改变大小后,需延迟绘图,否则绘图内容可能不显示或一闪而过

    绘制时,尺寸计算以设置的style为准

    a)ctx = uni.createCanvasContext() b)ctx = canvasEle.getContext('2d'),

    a和b所得到的ctx,其所拥有的方法略有差异,前者有ctx.draw(), 后者则无此方法,具体以uni文档及H5canvas方法为准

    drawImage()方法,其image参数定义,前者为imagePath, 后者则为Image对象,此为微信小程序与H5 canvas的差异

    前者在onReady中绘图,也需延迟并调用ctx.draw(); 在onLoad中绘图无效;其他时候绘图均需调用ctx.draw()

    uni.canvasToTempFilePath()得到的image的大小,为设置大小的SystemInfo.pixelRatio倍

    2020-03-16 11:58

该问题目前已经被锁定, 无法添加新回复