【微信小程序】解决canvas组件永远在最高层问题

7 篇文章 0 订阅
5 篇文章 0 订阅

详情参考微信小程序文档原生组件

1、为什么canvas组件总是会在最上层?

由于canvas组件是原生组件,原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上。

2、 如何解决canvas层级最高问题?
方法一:用原生组件覆盖原生组件

为了解决原生组件层级最高的限制。小程序专门提供了 cover-viewcover-image 组件,可以覆盖在部分原生组件上面。这两个组件也是原生组件,但是使用限制与其他原生组件有所不同。
比如:cover-view只支持嵌套 cover-viewcover-imagebutton

方法二:让canvas在图片和canvas间切换

因为cover-view只支持嵌套 cover-viewcover-imagebutton,对于canvas上显示弹窗中的input之类的需求就不太符合。

思路:在data里定义了一个canvasImg,然后在wxml中判断,是否这个值是否有效,若有效,canvas隐藏;否则,显示canvas。然后在页面渲染canvas时,执行了wx.canvasToTempfilepath方法,将雷达图转化为图片。此时给canvasImg赋值,canvas隐藏,image显示。下面是具体实现代码:

wxml:

<view class="canvas-content">
   <canvas
      canvas-id="myCanvas"
      wx:if="{{!canvasImg}}"
      style="width: 260px; height: 180px;">
   </canvas>
   <image wx:else src="{{canvasImg}}" style="width: 260px; height: 180px;" />
</view>

js:

// 需要让 弹窗等 出现在canvas上的事件
handleCanvarToImg() {
  var that=this;
  wx.canvasToTempFilePath({
    x: 0,
    y: 0,
    width: 260,
    height: 180,
    canvasId: 'myCanvas',
    success: function(res) {
      that.setData({ canvasImg: res.tempFilePath});
    }
  });
},
// 最后弹窗等消失时,触发的事件中需将canvasImg初始化(=null)
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的微信小程序canvas组件画光谱图的实例: wxml代码: ```html <canvas id="canvas" style="width: 100%; height: 300px;"></canvas> ``` js代码: ```javascript Page({ onReady: function () { const ctx = wx.createCanvasContext('canvas'); const width = wx.getSystemInfoSync().windowWidth; const height = 300; const colors = [ '#ff0000', '#ff7f00', '#ffff00', '#00ff00', '#0000ff', '#8b00ff', ]; const numBars = colors.length; const barWidth = width / numBars; const freqByteData = new Uint8Array(numBars); const barHeight = freqByteData.length; const x = 0; const y = height - barHeight; const gap = 2; function draw() { requestAnimationFrame(draw); ctx.clearRect(0, 0, width, height); ctx.fillStyle = '#333'; ctx.fillRect(0, 0, width, height); ctx.fillStyle = '#fff'; ctx.fillRect(x, y, numBars * barWidth + gap * (numBars - 1), barHeight); ctx.save(); ctx.translate(x, y + barHeight); for (let i = 0; i < numBars; ++i) { const value = freqByteData[i]; const percent = value / 256; const barHeight = height * percent; const color = colors[i]; ctx.fillStyle = color; ctx.fillRect(i * (barWidth + gap), -barHeight, barWidth, barHeight); } ctx.restore(); wx.getBackgroundAudioManager().getRealtimeFrequencyData(freqByteData); } draw(); }, }); ``` 这个实例中,我们使用了 `wx.createCanvasContext` 创建了一个画布,获取窗口的宽度和高度,并定义了一些颜色,条形数量等变量。我们还定义了一个 `freqByteData` 数组,用于存储频率数据。 在 `draw` 函数中,我们使用 `requestAnimationFrame` 来循环绘制画布。我们首先清空画布,然后绘制一个白色的矩形作为背景。接着,我们使用 `getBackgroundAudioManager` API 获取音频的实时频率数据,并将其存储在 `freqByteData` 数组中。最后,我们使用循环来绘制每个条形,并根据频率数据和颜色来设置条形的高度和颜色。 在页面加载完成后,我们调用 `draw` 函数来开始绘制画布。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值