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


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 相关文章推荐
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
手机图片预览插件photoswipe.js使用总结
Aug 25 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
javascript简易画板开发
Apr 12 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
layer插件select选中默认值的方法
Aug 14 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
Vue退出登录时清空缓存的实现
Nov 12 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 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
mysql 字段类型说明
2007/04/27 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP简单日历实现方法
2016/07/20 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
利用ctypes提高Python的执行速度
2016/09/09 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
服装厂厂长岗位职责
2013/12/27 职场文书
元旦晚会感言
2014/03/12 职场文书
认真学习保证书
2015/02/26 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android