安卓app巨坑 nvue后者页面要写画笔绘制功能nvue canvas

前期web浏览器上面canvas可以很支持vue页面,因为要用原生插件组件必须是nvue才能使用显示出来所以重构(真的巨坑),然后之前写的绘制功能canvas又不能生效了是因为nvue原生weex啥的原因导致直接方法无效我丢。

话不多说实现方式上效果:

思路:nvue + <web-view> + H5 Canvas

在 nvue 页面中放 <web-view src="/static/draw.html">

draw.html 用标准 HTML5 Canvas + JS 实现手指绘制

1️⃣ nvue 页面:pages/home/draw.nvue

复制代码
  <template>
    <view class="page">
      <web-view :src="webViewUrl" class="webview"></web-view>
    </view>
  </template>

  <script>
  export default {
    data() {
      return {
        // H5 文件路径,放在 /static/draw.html
        webViewUrl: '/static/draw.html'
      }
    }
  }
  </script>

  <style scoped>
  .page {
    flex: 1;
  }
  .webview {
    flex: 1;
  }
  </style>

2️⃣ H5 页面:static/draw.html

复制代码
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>手指画笔</title>
    <style>
      html, body {
        margin: 0;
        padding: 0;
        height: 100%;
        background: #111;
        overflow: hidden;
      }
      #canvas {
        display: block;
        background: #fff;
        touch-action: none; /* 防止滚动 */
      }
      #controls {
        position: absolute;
        top: 10px;
        left: 10px;
        z-index: 10;
      }
      button {
        margin-right: 10px;
        padding: 5px 10px;
      }
    </style>
  </head>
  <body>
    <canvas id="canvas"></canvas>
    <div id="controls">
      <button id="clearBtn">清空</button>
      <button id="logBtn">打印坐标</button>
    </div>
    <script>
      const canvas = document.getElementById('canvas');
      const ctx = canvas.getContext('2d');

      // 全屏自适应
      function resizeCanvas() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
      }
      window.addEventListener('resize', resizeCanvas);
      resizeCanvas();

      ctx.strokeStyle = '#000';
      ctx.lineWidth = 2;
      ctx.lineCap = 'round';
      ctx.lineJoin = 'round';

      let drawing = false;
      let lastX = 0;
      let lastY = 0;
      let points = []; // 存储轨迹坐标

      canvas.addEventListener('touchstart', (e) => {
        drawing = true;
        const touch = e.touches[0];
        lastX = touch.clientX;
        lastY = touch.clientY;
        points.push({x: lastX, y: lastY});
      });

      canvas.addEventListener('touchmove', (e) => {
        if (!drawing) return;
        const touch = e.touches[0];
        const x = touch.clientX;
        const y = touch.clientY;

        ctx.beginPath();
        ctx.moveTo(lastX, lastY);
        ctx.lineTo(x, y);
        ctx.stroke();

        lastX = x;
        lastY = y;
        points.push({x, y});
      });

      canvas.addEventListener('touchend', () => {
        drawing = false;
      });

      // 清空按钮
      document.getElementById('clearBtn').addEventListener('click', () => {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        points = [];
      });

      // 打印轨迹坐标
      document.getElementById('logBtn').addEventListener('click', () => {
        console.log('轨迹坐标:', points);
        alert('已打印到控制台');
      });
    </script>
  </body>
  </html>
相关推荐
浏览器工程师1 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆1 小时前
VSCode自动格式化三要素
前端
爱勇宝2 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen2 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
user20585561518134 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode4 小时前
Redis 在生产项目的使用
前端·后端
LiaCode5 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战5 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
风骏时光牛马5 小时前
# Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例
前端
weedsfly5 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript