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


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入门教程(6) Window窗口对象
Jan 31 Javascript
js event事件的传递与冒泡处理
Dec 06 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
Nov 30 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
Dec 04 Javascript
javascript表单事件处理方法详解
May 15 Javascript
js中获取键盘事件的简单实现方法
Oct 10 Javascript
JSONP跨域请求
Mar 02 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
Puppet的一些技巧
Sep 17 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 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
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python清理子进程机制剖析
2017/11/23 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Python中一般处理中文的几种方法
2019/03/06 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
实习公司领导推荐函
2014/05/21 职场文书
财务会计专业求职信
2014/06/09 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
大二学生自我检讨书
2014/10/23 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
教师节随笔
2015/08/15 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
Python实现对齐打印 format函数的用法
2022/04/28 Python