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


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 相关文章推荐
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
JavaScript 数组详解
Oct 10 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
Sep 20 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
微信小程序 数据缓存实现方法详解
Aug 26 Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 jQuery
JavaScript多种图形实现代码实例
Jun 28 Javascript
vue中touch和click共存的解决方式
Jul 28 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
77A一级收信机修理记
2021/03/02 无线电
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
jquery实现submit提交表单
2015/02/03 Javascript
javascript实现表单验证
2016/01/29 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python提取内容关键词的方法
2015/03/16 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
2014年应届大学生自我评价
2014/01/09 职场文书
学术会议主持词
2014/03/17 职场文书
企业人事任命书
2014/06/05 职场文书
社会发展项目建议书
2014/08/25 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
如何书写授权委托书?
2019/06/25 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers