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


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 相关文章推荐
Javascript 篱式条件判断
Aug 22 Javascript
JQuery 浮动导航栏实现代码
Aug 27 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
JS实现前端缓存的方法
Sep 21 Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 Javascript
小程序实现密码输入框
Nov 16 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
Python列表list数组array用法实例解析
2014/10/28 Python
django 外键model的互相读取方法
2018/12/15 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
Python常用类型转换实现代码实例
2020/07/28 Python
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
奶茶专卖店创业计划书
2014/01/18 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
2014年维修工作总结
2014/11/22 职场文书
平安建设汇报材料
2014/12/29 职场文书
部队2015年终工作总结
2015/04/02 职场文书