前言

小程序单指拖拽和双指操作是一个比较常用的功能,效果如下图

  • 实现这三个功能,主要用三个触摸事件touchstarttouchmovetouchend
<view style="height: 100vh; width: 100vw"><imagesrc="..."style="transform: translate({{translateX}}px, {{translateY}}px) scale({{scale}}) rotate({{rotate}}deg);"catch:touchstart="touchStart"catch:touchmove="touchMove"catch:touchend="touchEnd"/>
</view>
  • 用了以下变量
Page({data: {translateX: 0, // 位移x坐标 单位pxtranslateY: 0, // 位移y坐标 单位pxdistance: 0, // 双指接触点距离scale: 1, // 缩放倍数rotate: 0, // 旋转角度oldRotate: 0, // 上一次旋转停止后的角度startMove: { // 起始位移距离x: 0,y: 0,},startTouches: [] // 起始点touch数组},
})

单指拖拽

  • 单指拖拽比较简单,只需要记录移动的点坐标,然后减去起始点坐标,就可以求出针对页面的移动距离
  • touchstart
touchStart(e) {const touches = e.touchesconst { translateX, translateY } = this.dataconst { pageX, pageY } = touches[0]this.data.startMove = {x: pageX - translateX,y: pageY - translateY}this.data.startTouches = touches
},
  • touchmove
touchMove(e) {const touches = e.touchesconst { pageX: onePageX, pageY: onePageY } = touches[0]const { startMove } = this.datathis.setData({translateX: onePageX - startMove.x,translateY: onePageY - startMove.y})
}

双指缩放

  • 双指缩放的原理是根据两点坐标求出距离(勾股定理),然后在用移动坐标的距离比就可以求出缩放倍数
  • touchmove
touchMove(e) {const touches = e.touchesconst { pageX: onePageX, pageY: onePageY } = touches[0]const { startMove, scale, distance: oldDistance, startTouches } = this.dataif (touches.length === 2 && startTouches.length === 2) {// 双指缩放const { pageX: twoPageX, pageY: twoPageY } = touches[1]// 求出当前双指距离const distance = Math.sqrt((twoPageX - onePageX) ** 2 + (twoPageY - onePageY) ** 2)this.data.distance = distancethis.setData({scale: scale * (distance / (oldDistance || distance))})} else if (startTouches.length !== 2) {// 单指拖拽this.setData({translateX: onePageX - startMove.x,translateY: onePageY - startMove.y})}
}
  • startTouches.length !== 2这个判断的原因是防止图片跳动,因为如果你两个手指触摸,然后离开一个手指,我是禁止拖拽的,只有双指都离开后再次触摸才能单指拖拽

双指旋转

  • 双指旋转的原理是根据三角函数求出起始点的角度,然后再求出移动坐标的角度,相减然后加上上一次旋转的角度就等于你当前所需的选择角度
  • touchmove
touchMove(e) {const touches = e.touchesconst { pageX: onePageX, pageY: onePageY } = touches[0]const { startMove, scale, distance: oldDistance, startTouches, oldRotate } = this.dataif (touches.length === 2 && startTouches.length === 2) {const { pageX: twoPageX, pageY: twoPageY } = touches[1]const distance = Math.sqrt((twoPageX - onePageX) ** 2 + (twoPageY - onePageY) ** 2)
+   let rotate = this.getAngle(touches[0], touches[1]) - this.getAngle(startTouches[0], startTouches[1]) + oldRotate// 如果大于360度,就减去360
+   rotate = rotate > 360 ? rotate - 360 : rotatethis.data.distance = distancethis.setData({scale: scale * (distance / (oldDistance || distance)),
+     rotate})} else if (startTouches.length !== 2) {this.setData({translateX: onePageX - startMove.x,translateY: onePageY - startMove.y})}
},
  • getAngle
getAngle(p1, p2) {const x = p1.pageX - p2.pageXconst y = p1.pageY- p2.pageYreturn Math.atan2(y, x) * 180 / Math.PI
}
  • touchend
touchEnd() {// 保存当前旋转角度this.data.oldRotate = this.data.rotate
},

总结

  • 代码片段https://developers.weixin.qq.com/s/0nS1tImU7Rs5
  • H5原理一致,只需改一下语法即可
  • 我这个只是基础版本,如果需要一些边界控制和还一些需求的限制,计算据边框距离即可,也可以用小程序的boundingClientRectAPI

微信小程序单指拖拽和双指缩放旋转相关推荐

  1. 触摸屏单指拖拽、双指缩放、双指旋转

    //没有触摸 if (Input.touchCount <= 0){return;}//单点拖动else if (Input.touchCount == 1){touch1 = Input.Ge ...

  2. 【微信小程序】可拖拽操作的“树状图”模块的制作和小程序经验的总结

    去年三月份高中同学拉我做的微信小程序,尽管可能除了高一的时候做网页写过些js以后就再也没碰过(甚至高一时因为觉得"以后肯定不会做程序员"而拒绝学习代码),但得到了"你就写 ...

  3. 微信小程序 实现报表(表格)双指缩放功能

    实现前提要景: 1.本次实现双指缩放 是用css3中的scale配合translate 实现 2.小程序 不支持动态改变scale的大小 即使在写在行内样式中也不生效(在调试中不生效)故需借助小程序自 ...

  4. 微信小程序scroll-view 横向拖拽scroll-left不起作用的情况

    scroll-left设置需要在数据渲染之后 <scroll-view scroll-x="true" style="white-space: nowrap;hei ...

  5. 点击图片放大,实现移动端双指缩放,单指拖拽功能

    记录一下最近项目中用到的点击图片出现一个遮罩层,同时放大图片显示,移动端可双指缩放图片并单指拖拽图片.再次点击遮罩层透明区域,遮罩层消失 一.实现效果: 页面原图展示: 点击图片后: 二.代码实现: ...

  6. 微信小程序单页开发之 min-cli

    转载自:https://www.diycode.cc/projects/meili/min-cli?sync=1 Min Cli 令小程序组件的开发和使用变得愉悦 ○ 最佳实践 MinUI,是基于 M ...

  7. 微信小程序单次请求上限20条的坑

    近期在学习小程序云开发的时候,遇到一个坑,数据请求限制单次20条-- 即便是遍历请求会出现一个数据整合异常,因为每次拿到数据的时间不一致导致有先后顺序 这里加入一个判断数组长度的方法,让新请求到的数据 ...

  8. 微信小程序地图篇(腾讯地图)

    Welcome! 边学边记,完后整理.欢迎阅读. 文章目录 Welcome! 一.获取当前位置 二.拖动地图动态获取数据 三.动态显示视图中心附近的用户信息 一.获取当前位置 # map.wxml & ...

  9. 微信小程序image组件开发程序以及相关图片问题参考资料汇总

    微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对 ...

最新文章

  1. List-style-type属性失效
  2. git配置报错fatal: Authentication failed for ‘‘问题解决
  3. 在mac上命令行里面如何打开文本编辑器?
  4. [luogu5142]区间方差
  5. 1 张图秒懂 Nova 16 种操作 - 每天5分钟玩转 OpenStack(44)
  6. python 实现字典树_python字典树(Trie)的实现
  7. Unable to find the requested .Net Framework Data Provider
  8. winform 文件上传限制文件类型及文件大小
  9. JavaSE基础 ——流程控制语句
  10. uniapp对接阿里云OSS前端直传
  11. A3C的算法原理和算法流程
  12. 十二位计算机的使用方法,Win10专业版12个使用技巧汇总
  13. 阿里云盘+OneManager+Heroku+CFWorkers实现阿里云盘网络挂载
  14. java.util.Date中的loe_Java-学习日记(日期的转换与处理)
  15. 百度地图 控件——路网地图和影像地图切换
  16. linux测试读写的工具,Linux 下的硬盘读写速度测试工具
  17. 斐波那契数列求和——C语言(小白版)
  18. 行为模式--子类沙箱
  19. Yii2 中添加全局函数
  20. C语言I博客作业07

热门文章

  1. Q76:仿射变换(Affine Transformation)
  2. 怎么提升企业数据分析能力
  3. 如何针对数据进行分析
  4. 大数据分析方法有哪些
  5. oracle中ccuser,oracle数据库user profile设置方法
  6. java list foreach 修改_Java ArrayList在foreach中remove的问题分析
  7. 嵌入式linux驱动开发答辩问题,嵌入式Linux驱动工程师/BSP开发工程师面试笔试题集锦...
  8. emmap erlang_erLang学些笔记2—基本类型
  9. 微软纸牌服务器慢,微软为何设计纸牌和扫雷?真是用心良苦
  10. 装文件存储服务器Fastdfs