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


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 相关文章推荐
js跳转页面方法实现汇总
Feb 11 Javascript
全面解析Bootstrap图片轮播效果
Dec 03 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
vue增删改查的简单操作
Jul 15 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
Oct 30 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 Javascript
小程序瀑布流组件实现翻页与图片懒加载
May 19 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
Jul 28 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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php简单判断文本编码的方法
2015/07/30 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
低版本中Python除法运算小技巧
2015/04/05 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python3 处理JSON的实例详解
2017/10/29 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python地图绘制实操详解
2019/03/04 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
单位办理社保介绍信
2014/01/10 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
机关搬迁方案
2014/05/18 职场文书
干部个人对照检查材料
2014/08/25 职场文书
幼师自荐信范文
2015/03/06 职场文书
MySql数据库 查询时间序列间隔
2022/05/11 MySQL