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


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网页制作特殊效果用随机数
May 22 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
JavaScript中的关联数组问题
Mar 04 Javascript
详解jquery事件delegate()的使用方法
Jan 25 Javascript
复杂的javascript窗口分帧解析
Feb 19 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
Bootstrap基本组件学习笔记之进度条(15)
Dec 08 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
vue 左滑删除功能的示例代码
Jan 28 Javascript
layer父页获取弹出层输入框里面的值方法
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
解析php多线程下载远程多个文件
2013/06/25 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
Python中的高级数据结构详解
2015/03/27 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
python实现折半查找和归并排序算法
2017/04/14 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
django 自定义过滤器的实现
2019/02/26 Python
Django Rest framework频率原理与限制
2019/07/26 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
保安员岗位职责
2013/11/17 职场文书
年检委托书
2014/08/30 职场文书
学术会议邀请函
2015/01/30 职场文书
教师节领导致辞
2015/07/29 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
微信小程序调用python模型
2022/04/21 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers