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


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 相关文章推荐
JavaScript判断DOM何时加载完毕的技巧
Nov 11 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
js实现文字滚动效果
Mar 03 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
javaScript数组迭代方法详解
Apr 14 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
纯js实现画一棵树的示例
Sep 05 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
微信小程序身份证验证方法实现详解
Jun 28 Javascript
微信小程序实现录音功能
Nov 22 Javascript
vue和H5 draggable实现拖拽并替换效果
Jul 29 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
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
Prototype使用指南之range.js
2007/01/10 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python中列表(list)操作方法汇总
2014/08/18 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
安全生产标语
2014/06/06 职场文书
信访工作汇报材料
2014/10/27 职场文书
工程项目合作意向书
2015/05/08 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Python一行代码实现自动发邮件功能
2021/05/30 Python
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python