微信小程序中实现手指缩放图片的示例代码


Posted in Javascript onMarch 13, 2018

公司开发微信小程序,pm想实现如下需求:

用手指缩放图片。其实在实现这个需求以前,并不知道,微信公众号以及微信小程序里面有一个原生的api就自带这个特效,而且微信朋友圈也是用的这个api。wx.previewImage,就是它。预览图片。除了不能预览开发环境的本地电脑的图片外,你手机真机的图片,以及http服务器上的图片都是可以预览的,而且缩放功能做得很流畅。下面就说说如何用js来实现这个功能吧。

先上源码,然后在逐步剖析:

Page({
  data: {
    touch: {
      distance: 0,
      scale: 1,
      baseWidth: null,
      baseHeight: null,
      scaleWidth: null,
      scaleHeight: null
    }
  },
  touchstartCallback: function(e) {
    // 单手指缩放开始,也不做任何处理
    if(e.touches.length == 1) return
    console.log('双手指触发开始')
    // 注意touchstartCallback 真正代码的开始
    // 一开始我并没有这个回调函数,会出现缩小的时候有瞬间被放大过程的bug
    // 当两根手指放上去的时候,就将distance 初始化。
    let xMove = e.touches[1].clientX - e.touches[0].clientX;
    let yMove = e.touches[1].clientY - e.touches[0].clientY;
    let distance = Math.sqrt(xMove * xMove + yMove * yMove);
    this.setData({
      'touch.distance': distance,
    })
  },
  touchmoveCallback: function(e) {
    let touch = this.data.touch
    // 单手指缩放我们不做任何操作
    if(e.touches.length == 1) return
    console.log('双手指运动')
    let xMove = e.touches[1].clientX - e.touches[0].clientX;
    let yMove = e.touches[1].clientY - e.touches[0].clientY;
    // 新的 ditance
    let distance = Math.sqrt(xMove * xMove + yMove * yMove);
    let distanceDiff = distance - touch.distance;
    let newScale = touch.scale + 0.005 * distanceDiff
    // 为了防止缩放得太大,所以scale需要限制,同理最小值也是
    if(newScale >= 2) {
      newScale = 2
    }
    if(newScale <= 0.6) {
      newScale = 0.6
    }
    let scaleWidth = newScale * touch.baseWidth
    let scaleHeight = newScale * touch.baseHeight
    // 赋值 新的 => 旧的
    this.setData({
      'touch.distance': distance,
      'touch.scale': newScale,
      'touch.scaleWidth': scaleWidth,
      'touch.scaleHeight': scaleHeight,
      'touch.diff': distanceDiff
    })
  },
  bindload: function(e) {
   // bindload 这个api是<image>组件的api类似<img>的onload属性
   this.setData({
     'touch.baseWidth': e.detail.width,
     'touch.baseHeight': e.detail.height,
     'touch.scaleWidth': e.detail.width,
     'touch.scaleHeight': e.detail.height
   })
  }
})

wxml文件对应如下,就不做解释了:

<view class="container">
  <view bindtouchmove="touchmoveCallback" bindtouchstart="touchstartCallback">
    <image src="../../resources/pic/cat.jpg" style="width: {{ touch.scaleWidth }}px;height: {{ touch.scaleHeight }}px" bindload="bindload"></image>
  </view>
</view>

写到这里发现,就算小程序用不了这个js,我的ht5页面也是可以用的,哈哈。

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

Javascript 相关文章推荐
js异或加解密效果代码
Jun 25 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
Aug 27 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
Nov 09 Javascript
JQueryEasyUI datagrid框架的基本使用
Apr 08 Javascript
无闪烁更新网页内容JS实现
Dec 19 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
深入浅析Node.js 事件循环
Dec 20 Javascript
详解Webpack-dev-server的proxy用法
Sep 08 Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 jQuery
Vue 中使用富文本编译器wangEditor3的方法
Sep 26 Javascript
vue cli4下环境变量和模式示例详解
Apr 09 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 #Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 #Javascript
vue加载自定义的js文件方法
Mar 13 #Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 #Javascript
vue页面离开后执行函数的实例
Mar 13 #Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
Mar 13 #Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 #Javascript
You might like
用ODBC的分页显示
2006/10/09 PHP
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
python实现DES加密解密方法实例详解
2015/06/30 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
财务管理个人自荐书范文
2013/11/24 职场文书
营业员实习自我鉴定
2013/12/07 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
消防安全员岗位职责
2014/03/10 职场文书
业务员的岗位职责
2014/03/15 职场文书
办理收楼委托书范本
2014/10/09 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS