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


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 相关文章推荐
jquery简单的拖动效果实现原理及示例
Jul 26 Javascript
node.js解决获取图片真实文件类型的问题
Dec 20 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
基于jquery实现的鼠标悬停提示案例
Dec 11 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
Ext JS 实现建议词模糊动态搜索功能
May 13 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
原生js实现购物车功能
Sep 23 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
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python装饰器decorator介绍
2014/11/21 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python实现字符串加密成纯数字
2019/03/19 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
好的演讲稿开场白
2013/12/30 职场文书
保险公司早会主持词
2014/03/22 职场文书
农业开发项目建议书
2014/05/16 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL