• 【canvas教程】实现画布拖动、定点缩放,支持手势与鼠标滚轮操作


    效果展示:

    实现原理:

    1.求实现定点缩放所需的位移值

    定点缩放:从图中选取某点(参照物)为中心点进行缩放,缩放时无论图像怎么变化,该点位置始终固定不变。

    有想深入了解实现原理的,不妨试着做一下我下面出的一道题:

    有一个长4000px、宽4000px的四方形ABCD,A点的坐标固定在(-2000,-2000),该四边形上有一个点E,坐标为(-100,-300),将该四方形复制一份并缩小到90%后,新四边形的A点坐标为多少时可使新四边形的E点与原四边形的E点重合?

    2.求手势缩放的中心点

    勾股定理:直角三角形两直角边为a和b,斜边为c,那么a²+b²=c²。

    根据勾股定理求得两点间距离后,再求得两点间的中点坐标。

    中点坐标 = (起点坐标) + (两点间距 / 2) = (终点坐标) - (两点间距 / 2)

    实现代码:

    1. <template>
    2. <view>
    3. <canvas
    4. id="gameCanvas"
    5. canvas-id="gameCanvas"
    6. disable-scroll
    7. style="width: 100vw;height: 100vh;"
    8. @touchstart="onTouchStart"
    9. @touchmove="onTouchMove"
    10. >canvas>
    11. view>
    12. template>

    监听Web端鼠标滚轮实现定点缩放

    加入 mousewheel 监听鼠标滚轮事件后,在回调中直接调用 scaleCanvas 即可。

    1. onReady() {
    2. const sys = uni.getSystemInfoSync();
    3. this.viewWidth = sys.screenWidth;
    4. this.viewHeight = sys.screenHeight;
    5. this.canvasContext = uni.createCanvasContext('gameCanvas');
    6. this.drawImg();
    7. // 监听 PC 端鼠标滚轮
    8. if(sys.uniPlatform === 'web') {
    9. window.addEventListener('mousewheel', (e) => {
    10. this.scaleCanvas(e.deltaY > 0, e);
    11. });
    12. }
    13. },

    其他说明:

    1.如使用 ts 语法,在 import 图片时遇 `Cannot find module...` 错误,可在 `*.d.ts` 文件中添加 `declare module '*.jpg';` 

    2.示例代码是基于 uniapp 框架实现。

    3.其中画布拖动的代码是基于我上篇文章【canvas教程】绘制大图并实现画布拖动 ,如只实现拖动或区分拖动和缩放的代码可参考上篇文章。

  • 相关阅读:
    MySQL - 深入理解锁机制和实战场景
    Struct模块到底有多实用?一个知识点立马学习
    Foxit PDF
    windows开机自启动和忘记密码-备忘
    专注于linux
    相机等效焦距
    [数据结构初阶]初识
    架构:C4 Model
    Ubuntu系统Kubernetes(1.25)快速安装手册
    Spark任务优化分析
  • 原文地址:https://blog.csdn.net/Honiler/article/details/127765221