安卓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>
相关推荐
水瓶夜之9 小时前
.NET 中的新增功能系列文章——.NET SDK中的新增功能
前端·chrome·.net
笨笨狗吞噬者10 小时前
VS Code 内置浏览器打开网页
前端
SamChan9010 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
甲维斯10 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
奈斯先生Vector10 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频
海带紫菜菠萝汤10 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
名字还没想好☜10 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件10 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
10share10 小时前
React 新一代样式隔离方案 —— 编译时、零运行时、原生写法
前端·react.js
upgrador11 小时前
桌面应用开发:Electron 与 NSIS 的关系、打包流程及 Windows 本地构建实战
javascript·windows·electron