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


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 相关文章推荐
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
javascript的 {} 语句块详解
Feb 27 Javascript
JS全局变量和局部变量最新解析
Jun 24 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
Vue.js自定义指令的用法与实例解析
Jan 18 Javascript
JSONP跨域请求
Mar 02 Javascript
原生JS京东轮播图代码
Mar 22 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 Javascript
如何理解Vue的作用域插槽的实现原理
Aug 19 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
Node.js动手撸一个静态资源服务器的方法
Mar 09 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
PHP错误和异长常处理总结
2014/03/06 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
js 文件引入实现代码
2010/04/23 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
python 实现的车牌识别项目
2021/01/25 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
C语言变量的命名规则都有哪些
2013/12/27 面试题
药学专业学生的自我评价分享
2014/02/06 职场文书
产品生产计划书
2014/05/07 职场文书
保护环境演讲稿
2014/05/10 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL