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


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 相关文章推荐
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 Javascript
javascript动态加载三
Aug 22 Javascript
div模拟选择框示例代码
Nov 03 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
javascript禁止超链接跳转的方法
Feb 02 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
详解javascript中的变量提升和函数提升
May 24 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
浅析js中mvvm模式实现的原理
Oct 06 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
vue2实现provide inject传递响应式
May 21 Vue.js
基于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+Html+缓存
2006/12/20 PHP
PHP中的session安全吗?
2016/01/22 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
Python字符串详细介绍
2015/05/09 Python
Python实现线程池代码分享
2015/06/21 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
python3.4爬虫demo
2019/01/22 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
教师的实习鉴定
2013/12/15 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
庆元旦演讲稿
2014/09/15 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python
Python实现仓库管理系统
2022/05/30 Python