小程序实现图片移动缩放效果


Posted in Javascript onMay 26, 2020

本文实例为大家分享了小程序实现图片移动缩放效果的具体代码,供大家参考,具体内容如下

git地址 , 如果对您有帮助给个start呗

尝试了movable-view标签是很方便, 但是我想有个拉伸按钮去缩放图片, 于是尝试自己写了.
思想利用catchtouchmove属性计算偏移量, 实时更新坐标

小程序实现图片移动缩放效果

以下是完整代码

js

/**
 * All right by NieYinlong
 */

Page({

 /**
 * 页面的初始数据
 */
 data: {
 bgBoxHeight: 400, // 背景的高度
 bgBoxWidth: 320, // 背景的宽度
 
 moveImgLeft: 40,
 moveImgTop: 80,
 moveImgH: 100,
 moveImgW: 100,

 scaleIconFixWidth: 30,
 scaleLeft: 0,    // 拉伸按钮默认x坐标 (拉伸按钮默认宽高30)
 scaleTop: 0,    // 拉伸按钮默认y坐标
 },

 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) {
 const halfWidth = this.data.scaleIconFixWidth / 2
 this.setData({
  scaleLeft: this.data.moveImgLeft + this.data.moveImgW - halfWidth,
  scaleTop: this.data.moveImgTop + this.data.moveImgH - halfWidth
 })
 },

 // 图片移动
 moveImgTouchmove: function(e) {
 console.log(e)
 let pageX = e.changedTouches[0].pageX
 let pageY = e.changedTouches[0].pageY
 
 
 // (this.data.moveImgW / 2)是因为触摸放到中间位置
 let toLeft = pageX - this.data.moveImgW / 2; 
 let toTop = pageY - this.data.moveImgH / 2;

 const halfWidth = this.data.scaleIconFixWidth / 2

 // 限制x左边不能出边框
 if (pageX - (this.data.moveImgW / 2) <= 0) {
  return;
 }
 
 // 限制右边不能出超过边框
 if ((pageX + (this.data.moveImgW / 2)) >= (this.data.bgBoxWidth)) {
  return;
 }

 // 限制top
 if (pageY - (this.data.moveImgH / 2) <= 1) {
  return;
 }

 // 限制bottom
 if ((pageY + (this.data.moveImgH / 2)) >= this.data.bgBoxHeight) {
  return;
 }


 this.setData({
  moveImgLeft: toLeft,
  moveImgTop: toTop,
  scaleLeft: toLeft + this.data.moveImgW - halfWidth,
  scaleTop: toTop + this.data.moveImgH - halfWidth
 })
 },
 
 // 拉伸按钮移动
 scaleTouchmove: function (e) {
 console.log(e)
 let pageX = e.changedTouches[0].pageX
 let pageY = e.changedTouches[0].pageY
 const halfWidth = this.data.scaleIconFixWidth / 2
 let toLeft = pageX - halfWidth // 减去halfWidth是拉伸按钮宽度的一半
 let toTop = pageY - halfWidth

 
 let changedW = pageX - this.data.moveImgLeft
 let changedH = pageY - this.data.moveImgTop

 // 限制最moveImg小尺寸
 if (toLeft <= (this.data.moveImgLeft + halfWidth)) {
  return;
 }
 if (toTop <= (this.data.moveImgTop + halfWidth)) {
  return;
 }

 // 限制moveImg最大尺寸
 if(pageX - this.data.moveImgLeft > 250) {
  // 宽度达到最大值
  return;
 }
 if (pageY - this.data.moveImgTop > 250) {
  // 高度达到最大值
  return;
 }

 // 限制拉伸按钮的right
 if(this.data.scaleLeft + this.data.scaleIconFixWidth >= this.data.bgBoxWidth) {
  return;
 }
 // 限制拉伸按钮的bottom
 if (this.data.scaleTop + this.data.scaleIconFixWidth >= this.data.bgBoxHeight) {
  return;
 }

 this.setData({
  scaleLeft: toLeft,
  scaleTop: toTop,
  moveImgW: pageX - this.data.moveImgLeft,
  moveImgH: pageY - this.data.moveImgTop,
 })
 },

})

wxml

<view 
 class='bgBox' 
 style="height:{{bgBoxHeight}}px; width:{{bgBoxWidth}}px"
>
 <image 
 class='movedImg'
 src='../../image/moveImg.png'
 catchtouchmove='moveImgTouchmove'
 style="width:{{moveImgW}}px;height:{{moveImgH}}px; left:{{moveImgLeft}}px;top:{{moveImgTop}}px"
 />
 
 <image 
 src='../../image/spreadIcon.png'
 class='scaleIcon'
 catchtouchmove='scaleTouchmove'
 style="width:{{scaleIconFixWidth}}px;height:{{scaleIconFixWidth}}px; left:{{scaleLeft}}px; top:{{scaleTop}}px"
 />
</view>

wxss

.bgBox {
 border: 2px solid green;
 height: 400px;
 width: 99vw;
}

.movedImg {
 position: absolute;
 border: 3px dotted rgb(255, 166, 0);
}

.scaleIcon {
 position: absolute;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript使用shift方法移除素组第一个元素实例分析
Apr 06 Javascript
js实现简单div拖拽功能实例
May 12 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
vue-cli webpack 引入jquery的方法
Jan 10 jQuery
浅谈Vue内置component组件的应用场景
Mar 27 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
Jul 17 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
jQuery实现的分页插件完整示例
May 26 #jQuery
js实现时间日期校验
May 26 #Javascript
Node.js API详解之 assert模块用法实例分析
May 26 #Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
May 26 #Javascript
js校验开始时间和结束时间
May 26 #Javascript
vue实现简单跑马灯效果
May 25 #Javascript
Js和VUE实现跑马灯效果
May 25 #Javascript
You might like
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
python目录与文件名操作例子
2016/08/28 Python
python绘制条形图方法代码详解
2017/12/19 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Pytorch转tflite方式
2020/05/25 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
中职生自荐信
2013/10/13 职场文书
应届护士推荐信
2013/11/16 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
请假条的格式
2014/04/11 职场文书
寒假家长评语大全
2014/04/16 职场文书
公务员诚信承诺书
2014/05/26 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
营销计划书
2015/01/17 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
暂停营业通知
2015/04/25 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python