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


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 相关文章推荐
用js遍历 table的脚本
Jul 23 Javascript
写入cookie的JavaScript代码库 cookieLibrary.js
Oct 24 Javascript
JS判断当前日期是否大于某个日期的实现代码
Sep 02 Javascript
javascript定义变量时加var与不加var的区别
Dec 22 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
整理关于Bootstrap表单的慕课笔记
Mar 29 Javascript
JavaScript原生数组Array常用方法
Apr 06 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 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
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
jquery 事件对象属性小结
2010/04/27 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python3 字符串知识点学习笔记
2020/02/08 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Python wordcloud库安装方法总结
2020/12/31 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
HTML5之语义标签介绍
2016/07/07 HTML / CSS
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
电大物流学生的自我评价
2013/10/25 职场文书
安全生产检讨书
2014/01/21 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL