安卓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>
相关推荐
跨境数据猎手几秒前
跨境电商系统三大 Web 漏洞的防护:SQL 注入、XSS、CSRF
前端·sql·xss
冒险的豆子35 分钟前
Proxy & Vue 响应式(合并精简版,适合面试)
前端·javascript·vue.js
Java后端的Ai之路1 小时前
前端技术Vue-18-视图中的渲染
前端·javascript·vue.js
程序员海军7 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee8 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel9 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰10 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境10 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉11 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
濮水大叔11 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程