UNIAPP利用canvas绘制图片和文字,并跟随鼠标移动
最近有个项目,要触摸组件,产生一条图片跟随移动,并显示相应的文字,在网上找了一些资料,终于完成构想,废话少说,直接上代码(测试通过)
<template>
<view>
<view class="btnBox">
<view class="btn" style="background-color: blue;" @click="moveImage">移动图片</view>
</view>
<canvas canvas-id="myCanvas" id="myCanvas" @touchstart="handleTouchStart" @touchmove="handleTouchMove"
@touchend="handleTouchEnd"></canvas>
</view>
</template>
<script>
export default {
data() {
return {
ctx: '',
beginX: '',
beginY: '',
movedX: '',
movedY: '',
layers: [],
toBase64Url: "",
bloburl: "",
}
},
onLoad() {
this.ctx = uni.createCanvasContext('myCanvas')
},
methods: {
moveImage() {
let that = this;
var Image = "";
//var Image="https://www.small-helper.com/account.png";//网络图片地址
//Image="http://localhost:8080/static/images/wx_img/dkk.png"//本地服务器内图片直接地址
uni.getImageInfo({
src: '/static/images/wx_img/dkk.png',
success: function(res) {
// console.log(res);
Image = res.path;
var contentWidth = res.width;
var contentHeight = res.height;
//
let layer = {
type: 'photo',
resoure: Image,
//resoure:"http://localhost:8080/static/images/wx_img/dkk.png",
x: 0,
y: 0,
w: 150,
h: 150,
isDrag: false
}
that.layers.push(layer);
that.darwImages(Image, layer.x, layer.y, layer.w, layer.h);
},
fail() {
that.$Common.toast(";获取图片失败")
}
});
/*从相册获取图片进行移动
uni.chooseImage({
success: (res) => {
let layer = {
type: 'photo',
resoure: res.tempFilePaths[0],
x: 0,
y: 0,
w: 200,
h: 150,
isDrag: false
}
//console.log(res.tempFilePaths[0]);
that.urlTobase64("/static/images/wx_img/dkk.png");
console.log(that.toBase64Url);
//let bloburl=that.dataURLToBlob(url);
that.layers.push(layer);
this.darwImages(res.tempFilePaths[0],layer.x,layer.y,layer.w,layer.h)
}
})*/
},
darwImages(url, x, y, w, h) {
this.ctx.drawImage(url, x, y, w, h);//设置图片初始位置
this.ctx.setFontSize(uni.upx2px(40));//设置字体尺寸
this.ctx.setFillStyle("#5500ff");
//this.ctx.font = "songti";
this.ctx.fillText('nihao',x+50,y-1);
this.ctx.draw(true);
},
draw() {
//var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function() {
//this.ctx.drawImage(img, 0, 0);
this.ctx.beginPath();
this.ctx.moveTo(30, 96);
this.ctx.lineTo(70, 66);
this.ctx.lineTo(103, 76);
this.ctx.lineTo(170, 15);
this.ctx.stroke();
this.ctx.fillText('nihao',10,100);
};
img.src = "/static/images/wx_img/dkk.png";
//img.src = 'https://mdn.mozillademos.org/files/5395/backdrop.png';
},
//可通过此方法对本地路径 如: …/…/static/img/01.png 或者网络路径图片转为base64
urlTobase64(url) {
var that = this;
//var toBase64Url;
uni.request({
url: url,
method: 'GET',
responseType: 'arraybuffer',
success: async res => {
let base64 = wx.arrayBufferToBase64(res.data); //把arraybuffer转成base64
that.toBase64Url = 'data:image/jpeg;base64,' + base64; //不加上这串字符,在页面无法显示
//console.log(that.toBase64Url);
//return toBase64Url ;
return (that.dataURLToBlob(that.toBase64Url));
}
});
},
// DataURL转Blob对象
dataURLToBlob(dataurl) {
console.log(dataurl);
var arr = dataurl.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
var bstr = atob(arr[1]);
var n = bstr.length;
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var dataURL1 = this.windowURL.createObjectURL(new Blob([u8arr], {
type: mime
}));
// console.log(dataURL1);
return new Blob([u8arr], {
type: mime
});
//console.log(new Blob([u8arr], {type:mime}));
},
handleTouchStart(e) {
let {
x,
y
} = e.changedTouches[0]
this.beginX = x
this.beginY = y
for (var i = this.layers.length - 1; i >= 0; i--) {
if (x > this.layers[i].x && y > this.layers[i].y && x < this.layers[i].w + this.layers[i].x && y < this
.layers[i].h + this.layers[i].y) {
this.layers[i].isDrag = true
let selectObj = this.layers[i]
this.layers.splice(i, 1)
this.layers.push(selectObj)
//console.log(selectObj)
break
}
}
},
handleTouchMove(e) {
if (this.layers.length != 0 && this.layers[this.layers.length - 1].isDrag == true) {
let {
x,
y
} = e.changedTouches[0]
this.movedX = x - this.beginX
this.movedY = y - this.beginY
this.layers[this.layers.length - 1].x += this.movedX
this.layers[this.layers.length - 1].y += this.movedY
this.beginX = x
this.beginY = y
}
this.ctx.clearRect(0, 0, 750, 900)
this.layers.forEach(l => this.darwImages(l.resoure, l.x, l.y, l.w, l.h))
},
handleTouchEnd(e) {
if (this.layers.length != 0) {
this.layers[this.layers.length - 1].isDrag = false
}
}
}
}
</script>
<style>
.btnBox {
display: flex;
}
.btn {
width: 630rpx;
height: 90rpx;
line-height: 94rpx;
text-align: center;
//background: $wx_theme_blue;
color: #fff;
border-radius: 45rpx;
font-size: 36rpx;
margin: 80rpx auto 30rpx;
}
#myCanvas {
width: 750rpx;
height: 900rpx;
}
</style>
相关文章:
UNIAPP利用canvas绘制图片和文字,并跟随鼠标移动
最近有个项目,要触摸组件,产生一条图片跟随移动,并显示相应的文字,在网上找了一些资料,终于完成构想,废话少说,直接上代码(测试通过) <template> <view>…...

【智能电表数据接入物联网平台实践】
智能电表数据接入物联网平台实践 设备接线准备设备调试代码实现Modbus TCP Client 读取电表数据读取寄存器数据转成32bit Float格式然后使用modbusTCP Client 读取数据 使用mqtt协议接入物联网平台最终代码实现 设备接线准备 设备调试 代码实现 Modbus TCP Client 读取电表数…...
Docker--network命令的用法
原文网址:Docker--network命令的用法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker的network网络命令的用法。 官网网址 docker network | Docker Documentation 命令概述 所有命令 命令名称 说明 docker network connect 将容器连接到网络 dock…...

优维低代码实践:图片和搜索
优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…...

[Qt]控件
文章摘于 爱编程的大丙 文章目录 1. 按钮类型控件1.1 按钮基类 QAbstractButton1.1.1 标题和图标1.1.2 按钮的 Check 属性1.1.3 信号1.1.4 槽函数 1.2 QPushButton1.2.1 常用API1.2.2 按钮的使用 1.3 QToolButton1.3.1 常用API1.3.2 按钮的使用 1.4 QRadioButton1.4.1 常用API…...

GEE:快速实现时间序列线性趋势和变化敏感性计算(斜率、截距)以NDVI时间序列为例
作者:CSDN @ _养乐多_ 本博客将向您介绍如何使用Google Earth Engine(GEE)平台来处理Landsat 5、7和8的卫星图像数据,构建时间序列,以NDVI为例,计算NDVI时间序列的斜率和截距,以及如何导出这些结果供进一步分析使用。 文章目录 一、代码详解1.1 核心代码详解1.2 核心代…...

LC1713. 得到子序列的最少操作次数(java - 动态规划)
LC1713. 得到子序列的最少操作次数 题目描述LIS 动态规划 二分法代码演示 题目描述 难度 - 困难 LC1713.得到子序列的最少操作次数 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。 每一次…...

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码
众所周知,航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程,因此可利用虚拟仿真技术经济、安全及可重复性等特点,进行飞行任务或操作的模拟,以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合…...

一、八大排序(sort)
文章目录 一、时间复杂度(一)定义:常数操作 二、空间复杂度(一)定义: 三、排序(一)选择排序1.定义2.代码3.特性 (二)冒泡排序1.定义2.代码3.特性 (…...

【AWS】AI 代码生成器—Amazon CodeWhisperer初体验 | 开启开挂编程之旅
使用 AI 编码配套应用程序更快、更安全地构建应用程序 文章目录 1.1 Amazon CodeWhisperper简介1.2 Amazon CodeWhisperer 定价2.1 打开VS Code2.2 安装AWS ToolKit插件 一、前言 1.1 Amazon CodeWhisperper简介 1️⃣更快地完成更多工作 CodeWhisperer 经过数十亿行代码的训…...
【Mysql主从配置方法---单主从】
Mysql主从 主服务器 创建用户 create user “for_rep”“从服务器IP地址” IDENTIFIED by “123456” 授权 grant replication slave on . to “for_rep”“从服务器IP地址” IDENTIFIED by “123456” 查看用户权限 SHOW GRANTS FOR “for_rep”“从服务器IP地址”; 修改M…...

⼀⽂读懂加密资产交易赛道的新锐⼒量Bitdu
交易所,仍然是加密资产赛道的皇冠级赛道。围绕这个领域展开的商业竞争,最能引起⼴⼤⽤⼾的关注。 经历了数轮资产价格涨跌的⽜熊之后,⼀批批创业者也在不断地思考这⼀议题 — 如何在去中⼼化的世界中,最⾼效率地集结流量、资本和…...

万里牛与金蝶云星空对接集成查询调拨单连通调拨单新增(万里牛调拨单-金蝶【直接调拨单】)
万里牛与金蝶云星空对接集成查询调拨单连通调拨单新增(万里牛调拨单-金蝶【直接调拨单】) 源系统:万里牛 万里牛是杭州湖畔网络技术有限公司旗下SaaS软件品牌,主要针对电商、外贸、实体门店等业务群体,帮助企业快速布局新零售,提升订单处理效…...

虚拟DOM与diff算法
虚拟DOM与diff算法 snabbdom虚拟DOMdiff算法 snabbdom 是什么:snabbdom是著名的虚拟DOM库,是diff算法的鼻祖,Vue源码借鉴了snabbdom 虚拟DOM 是什么:本质上是存在内存里的 JavaScript 对象 作用:用来描述真实DOM的层…...

K8S:pod资源限制及探针
文章目录 一.pod资源限制1.pod资源限制方式2.pod资源限制指定时指定的参数(1)request 资源(2) limit 资源(3)两种资源匹配方式 3.资源限制的示例(1)官网示例(2࿰…...

CSS中的定位
position 的属性与含义 CSS 中的 position 属性用于控制元素在页面中的定位方式,有四个主要的取值,每个取值都会影响元素的布局方式,它们是: static(默认值): 这是所有元素的初始定位方式。在静…...

二、链表(linked-list)
文章目录 一、定义二、经典例题(一)[21.合并两个有序链表](https://leetcode.cn/problems/merge-two-sorted-lists/description/)1.思路2.复杂度分析3.注意4.代码 (二)[86.分割链表](https://leetcode.cn/problems/partition-list…...

Android EditText筛选+选择功能开发
在日常开发中经常会遇到这种需求,EditText既需要可以筛选,又可以点击选择。这里筛选功能用的是AutoCompleteTextView,选择功能使用的是第三方库https://github.com/kongzue/DialogX。 Android AutoCompleteTextView(自动完成文本框)的基本使用…...
Linux 信号 alarm函数 setitimer函数
/*#include <unistd.h>unsigned int alarm(unsigned int seconds);功能:设置定时器。函数调用,开始倒计时,0的时候给当前的进程发送SIGALARM信号参数:倒计时的时长。。单位:秒 如果参数为0,无效返回…...
自主设计,模拟实现 RabbitMQ - 实现发送方消息确认机制
目录 一、实现发送方消息确认 1.1、需求分析 什么是发送方的消息确认? 如何实现?...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...