uniapp使用canvas+手势缩放

这篇具有很好参考价值的文章主要介绍了uniapp使用canvas+手势缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能介绍,工程类app,需要在手机端查看图纸,canvas绘制点,线。整理随意放大缩小。

canvas uni-app,前端,android,Powered by 金山文档
  1. canvas绘制方法

//画布image
            drawImage(ctx, path, x, y, dWidth, dHeight) {
                ctx.drawImage(path, x, y, dWidth, dHeight)
            },
            //圆角矩形
            roundNode(ctx, x, y, width, height, radius, color) {
                //圆角矩形部分
                ctx.beginPath()
                if (width < 2 * radius) radius = width / 2;
                if (height < 2 * radius) radius = height / 2;
                ctx.moveTo(x + radius, y);
                ctx.arcTo(x + width, y, x + width, y + height, radius);
                ctx.arcTo(x + width, y + height, x, y + height, radius);
                ctx.arcTo(x, y + height, x, y, radius);
                ctx.arcTo(x, y, x + width, y, radius);
                ctx.setFillStyle(color)
                ctx.fill()
            },
            //绘制三角形  type:箭头朝向:bottom、right、left
            drawTriangle(ctx, x, y, color, type) {
                ctx.beginPath()
                let height = 10 //计算等边三角形的高
                ctx.moveTo(x, y); //x y开始
 
                switch (type) {
                    case 'bottom':
                        ctx.lineTo(x - height / 2, y)
                        ctx.lineTo(x, y + height)
                        ctx.moveTo(x, y)
                        ctx.lineTo(x + height / 2, y)
                        ctx.lineTo(x, y + height)
                        break;
                    case 'left':
                        ctx.lineTo(x, y - height / 2)
                        ctx.lineTo(x - height, y)
                        ctx.moveTo(x, y)
                        ctx.lineTo(x, y + height / 2)
                        ctx.lineTo(x - height, y)
                        break;
                    case 'right':
                        ctx.lineTo(x, y - height / 2)
                        ctx.lineTo(x + height, y)
                        ctx.moveTo(x, y)
                        ctx.lineTo(x, y + height / 2)
                        ctx.lineTo(x + height, y)
                        break;
                    default:
                        break;
                }
 
 
                ctx.setFillStyle(color)
                ctx.fill();
            },
            drawText(ctx, text, x, y, color, size) {
                //文字部分
                ctx.beginPath()
                ctx.setTextAlign('center')
                ctx.setFillStyle(color)
                ctx.setFontSize(size)
                const metrics = ctx.measureText(text)
                //文字统一偏移
                ctx.fillText(text, x + metrics.width / 2, y + 17)
            },
            // 绘制带箭头线 type:箭头朝向:bottom、right、left
            drawLine(ctx, fromX, fromY, toX, toY, color, type, isArrow = true, isDash = false) {
                ctx.beginPath()
                if (isDash) {
                    ctx.setLineDash([10]);
                } else {
                    ctx.setLineDash([]);
                }
                ctx.moveTo(fromX, fromY)
                ctx.lineTo(toX, toY)
                ctx.setLineWidth(1)
                ctx.setStrokeStyle(color)
                ctx.stroke()
                
                //是否绘制箭头
                if (isArrow) {
                    this.drawTriangle(ctx, toX, toY, color, type)
                }
            },
  1. 手势缩放 拖拽功能实现

<movable-area :scale-area="true" :style="{'width':windowWidth+'px','height':windowHeight+'px','backgroundColor':'#ddd','overflow':'hidden'}">
            <movable-view direction="all"  :inertia="true" :scale-min="0.001" :scale-max="4"              :scale="true" :style="{'width':widths+'px','height':heights+'px'}"
                 @scale="scaleChange">
                <canvas id="myCanvas" canvas-id="myCanvas" :style="{'width':widths+'px','height':heights+'px'}"
                    @touchstart="touchstart" />
            </movable-view>
</movable-area>

movable-view + movable-area 实现该功能

windowWidth、windowHeight 是计算屏幕占比 如果需要多设备可以参考

widths、heights 动态movable-view宽高 (我这里图纸太大需要一定缩放,并且movable-view内容最好跟movable-view宽高相同)

//开始绘制
that.context = uni.createCanvasContext('myCanvas')
//画背景
            that.drawImage(that.context,that.infos.pic, 0, 0,that.widths, that.heights)
            //画节点
            //开始节点
           this.roundNode(this.context, 553, 38, 100, 36, 26, '#1EC1C3')
            this.node.push({
                x:553,
                y:38,
                w:100,
                h:36,
                targe:0
            })
                        that.context.draw()
//s缩放比例
scaleChange(e) {
    this.scale = e.detail.scale
}
//点击事件 判断缩放比例 
            touchstart(e) {
                let x = e.touches[0].x
                let y = e.touches[0].y
                this.node.forEach(item => {
                    if (x > item.x * this.scale && x < (item.x + item.w) * this.scale
                        && y > item.y * this.scale && y < (item.y + item.h) * this.scale) {
                        //在范围内,根据标记定义节点类型
                        this.lookDetial(item)
                    }
                }) 
            },

目前就可以 最后需要注意 uniapp 对画布图片的大小,宽高,有很大的限制,如果页面没有显示,或者报错 80%就是这个原因

plus.io.resolveLocalFileSystemURL 安卓可以使用这个来压缩 文章来源地址https://www.toymoban.com/news/detail-678496.html

到了这里,关于uniapp使用canvas+手势缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app:官方文档中的canvas实例剖析

    canvas | uni-app官网 (dcloud.net.cn)

    2024年02月07日
    浏览(49)
  • 微信小程序canvas实现简易手写签名版(uni-app)

    微信小程序可以通过canvas实现手写签名的效果,本文中使用的是微信小程序Canvas 2D接口 本示例中绘制的是横屏签名的效果,效果图如下: 这里我们需要调整canvas的物理宽高,默认物理宽高为300*150px,物理宽高调整通过css样式即可,本文中需要根据屏幕高度进行动态调整,使

    2024年02月12日
    浏览(68)
  • uni-app微信小程序-利用canvas给图片添加水印

    选择图片 → 将图片绘制到 canvas 中并绘制水印 →将添加水印的图片绘制到 canvas 中 → 将 canvas 画布转换为图片地址 → 上传/展示操作 注意:微信小程序在选择照片或者唤起相机之前需要获取相应的 权限 利用 uni.getSetting 查看用户是否调用相机的权限(有就选择图片,没有就

    2024年02月06日
    浏览(59)
  • uni-app,关于 canvas 在 app,小程序, h5中,实现绘制,保存本地图片

    没有套路,没有难读的文档,直接看代码 html部分 js部分

    2024年02月13日
    浏览(63)
  • uni-app 微信小程序中如何通过 canvas 画布实现电子签名?

    一、实际应用场景 电子签名软件应用场景:电子签名在金融、银行、贷款行业中可以用于对内日常办公流转的文档的盖章签字,对外涉及业务合作协议,采购合同,贷款申请、信用评估、贷款合同、贷款文件表、说明函等等。 可以说,只要是涉及纸质文档签字盖章的场景,

    2024年02月10日
    浏览(57)
  • 【Uni-App】uniapp使用uview实现弹出键盘输入密码/验证码功能

    组件使用的是uview组件,Keyboard 键盘和MessageInput 验证码输入两个组件配合使用。 通过mode参数定义键盘的类型,v-model绑定一个值为布尔值的变量,我绑定的是showKeyboard变量,控制键盘的弹出与收起; mode = number (默认值)为数字键盘,此时顶部工具条中间的提示文字为\\\"数字键盘

    2023年04月16日
    浏览(73)
  • uni-app 微信小程序 图文生成图片 wxml-to-canvas

    在做的小程序要增加一个将文字与图片生成图片不可修改的功能,第一次做,在网上找了不少资料。参考了wxml-to-canvas | 微信开放文档  ,又看了一些相关事例,尝试写了一下。   需要准备的文件及配置项: 1、先把代码片段下载到本地 2、创建wxcomponents目录,把代码片段中的

    2024年02月09日
    浏览(51)
  • miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)

    小程序分类:uni-app qq小程序 支付宝小程序 百度小程序 钉钉小程序 微信小程序 小程序转成uni_app 小程序转为uni_app 小程序转uni_app 小程序转换 工具现在支持npm全局库、HBuilderX插件两种方式使用,任君选择,HBuilderX插件地址:https://ext.dcloud.net.cn/plugin?id=2656 【miniprogram-to-uniapp】

    2024年02月08日
    浏览(59)
  • 【uni-app】后端返回base64转二维码并显示在canvas生成海报

    使用官方的 uni.getFileSystemManager().writeFile() 方法可将base64码转成的二维码显示在画布上,代码如下: const obj = {                     page: \\\'pages/sort/goodsDetail\\\',                     co_Nu: this.goodInfo.co_Nu                 }                 const _this = this       

    2024年02月11日
    浏览(63)
  • 『UniApp』uni-app-打包成App

    大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为微信小程序并且发布到微信小程序商店 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包成APP。 打包 App 也是一样的,首先需要配置关于 App 应用的基础信息,打开 manifest

    2024年02月04日
    浏览(108)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包