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


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读取和设定KindEditor值的方法
Nov 22 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 02 Javascript
vue、react等单页面项目应该这样子部署到服务器
Jan 03 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
JS实现对json对象排序并删除id相同项功能示例
Apr 18 Javascript
ES6 Array常用扩展的应用实例分析
Jun 26 Javascript
Ant Design的Table组件去除
Oct 24 Javascript
js删除对象中的某一个字段的方法实现
Jan 11 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新手上路(五)
2006/10/09 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
php 三维饼图的实现代码
2008/09/28 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
深入源码解析Python中的对象与类型
2015/12/11 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
银行求职自荐书
2014/06/25 职场文书
教师工作失职检讨书
2014/09/18 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js