微信小程序中利用image组件实现图片手势缩放,前端大神严灏的牛文,讲解了微信小程序中image组件的三种是缩放模式,三种之中,只有 aspectFit 模式可以等比例缩放图片,并显示完整的图片。

原文:http://www.ifanr.com/technotes/740404

微信小程序中,image 组件的 mode 有 12 种,其中只有三种是缩放模式。而在这三种之中,只有 aspectFit 模式可以等比例缩放图片,并显示完整的图片。此模式是保证图片长边完整地显示出来,而手机屏幕宽度都较小,以 iphone 6 为例,仅有 375 px。因此在小程序中浏览横向的图片或尺寸较大的图片时,图片细节就难以查看清楚(如下图)。

因此能动态的通过手势缩放图片,就很有必要。大众比较熟悉的手势是类似 app 中的双指缩放,我们的目标也是在小程序中实现此效果。

爱范儿工程师在仔细研究微信小程序的所有事件后发现,可以通过 touchmove 事件来实现双指缩放图片。此技术的核心思想是根据两只手指相对距离的变化来对图片进行放大或缩小。因此只要能知道两只手指相对距离的变化,并能做到对图片的动态缩放,就能实现我们想要的功能。

在手指接触到屏幕并开始移动后,对应的组件上就会以约为 16ms(屏幕渲染频率) 一次的速度不断触发 touchmove 事件,最后手指离开屏幕后,则会触发 touchend 事件。

touchmove 事件所包含的事件对象中有一个 touches 属性,此属性为当前停留在屏幕中的触摸点信息的数组。触摸点的信息包括 identifier(触摸点的标志符)、pageX / pageY(距离文档左上角的距离)、clientX / clientY(距离屏幕可显示区域左上角距离)。通过 clientX / clientY 可确定手指在屏幕上的位置。

xMove = e.touches[1].clientX - e.touches[0].clientX;

yMove = e.touches[1].clientY - e.touches[0].clientY;

distance = Math.sqrt(xMove * xMove + yMove * yMove);

distance 即为两只手指之间的距离。将此距离储存下来,下一次 touchmove 被触发的时候,再计算一次 distance。distanceDiff(newDistance - oldDistance) 即为两次 touchmove 触发的间隔间两个手指相对距离的变化值。此值为正数时,表示两指间距离在变大,即需要放大图片,反之则为需要缩小图片。

下面则需要确定一个规则,将 distance 的变化值与图片放大或缩小的变化率关联起来。我们将图片正常显示时的尺寸定为基准值,即 baseWidth 和 baseHeight,图片需要放大的倍数为 scale,scale 的初始值和最小值为 1,最大值可根据需要来设置。

爱范儿工程师经过多次试验,确定了一个公式:

newScale = oldScale + 0.005 * distanceDiff

此公式中的 0.005 为图片的缩放比例。在实测中,使用 0.005 这个值可获得比较良好的缩放体验。

通过上面的步骤,图片上绑定 touchmove 事件后,每次 touchmove 被触发后,我们都可以计算出新的图片需要被放大的倍数 scale。即每次 touchmove 被触发后,都可以得到一组图片被放大后的高宽值:scaleWidth(scale * baseWidth)、scaleHeight(scale * baseHeight)。

通过下面的方式就可以实现动态的更改图片的高宽

实现了图片的缩放之后,还需要一个容器存放图片,用 view 组件包裹 image,并设置overflow:scroll,即可以做到自由的缩放和浏览图片。

但是微信小程序中有一个更合适的组件:scroll-view,设置 scroll-x 和 scroll-y 为true,在放大图片后,滑动浏览图片时拥有比较良好的浏览体验。

但是,目前版本(0.10.102800)中的 scroll-view 组件还存在一个渲染上的 bug,偶尔会出现界面闪动的现象。而在双指缩放存在于 scroll-view 中的图片,极易触发此 bug。此问题,暂时只能等待微信进行修复,或者放弃 scroll-view,即放弃更好的滑动浏览效果,而使用 view 组件。

↓ 查看全文

html img 手势缩放,微信小程序中利用image组件实现图片手势缩放相关推荐

  1. 微信小程序中使用vant组件库(超详细)

    目录 前言 Vant Weapp的安装与使用 1.安装 node.js 2.通过 npm 安装 3.修改 app.json 4.修改 project.config.json 5.构建 npm 包 6. ...

  2. 微信小程序中使用wxss加载图片并实现动画

    微信小程序中使用wxss加载图片并实现动画 记录微信小程序中使用wxss加载图片并实现动画的方式,最终实现loading效果. 代码 .weui-loading { margin: 0 5px; wi ...

  3. 五分钟学会在微信小程序中使用 vantUI 组件库

    前言 我们在开发微信小程序时,设计和实现好用的用户界面无疑是至关重要的一步.但是微信小程序官方自带的 UI 组件库无法满足很多使用场景,这个时候就需要我们使用一些第三方的 UI 组件库.而 vant ...

  4. 微信小程序中使用video组件

    文章目录 前情提要 搭建视频服务器 小程序项目 app.json pages/index/index.wxml pages/index/index.wxss pages/index/index.js ...

  5. 讨论一下微信小程序中如何长按识别图片中二维码跳转

    [一].image标签展示二维码 目前微信官方支持小程序原生页面在微信版本IOS≥8.0.6,安卓≥8.0.3时直接长按识别二维码, <image src="二维码图片地址" ...

  6. 微信小程序中引用vant组件库

    步骤 1.vant组件库里面也有说明,它说package.json 和 node_modulles 必须在miniprogram目录下,可是一般你刚新建一个小程序项目的时候,是没有package.js ...

  7. 《九》微信小程序中的自定义组件

    开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用:也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护. 自定义组件:可复用的 WXML.WXSS.JS.JSON. beh ...

  8. 微信小程序例子——使用image组件显示图片

    1.效果展示 2.关键代码 1.index.wxml 2.index.js Page({ data:{ // text:"这是一个页面" imageSrc:'../../pages ...

  9. 微信小程序中Map地图组件的使用

    常用功能一:绘制地图标记点一个或多个 map.wxml <!-- longitude 经度 latitude 纬度 scale 缩放层级 最小5,最大18 markers 地图标记 bindma ...

最新文章

  1. python 功能 代码_挑战“不可能”的代码:你不知道的Python功能
  2. Scala 基础(4)—— 类和对象
  3. BRCM5.02编译七:No package 'uuid' found
  4. Mariadb的安装与配置
  5. linux之杀死某个应用或命令的一行终极命令
  6. html中日期格式化函数,JavaScript日期时间格式化函数分享
  7. 单表置换密码java代码实现_单表替换密码
  8. BUG解决:RuntimeError:Given groups=1,weight of size...expected input...but got 3 channels instead.
  9. 数据治理的目的与意义
  10. 学习数据库系统概论这一篇就够了
  11. 机器人机构学基础(朱大昌)第三章部分习题答案
  12. 超详细!Win10(UEFI启动)安装Ubuntu18.04双系统
  13. gtest从一无所知到熟练使用(3)什么是test suite和test case
  14. Unity GL函数库的简单使用
  15. 一份Yann LeCun等16个顶级数据科学家给新人的建议
  16. Centos搭建配置SDN
  17. Python -- 反编译pyc文件
  18. 记一次 .NET 某电子病历 CPU 爆高分析
  19. ubuntu更换源文件
  20. 初探富文本之OT协同算法

热门文章

  1. idea 解决ava.lang.NoClassDefFoundError错误
  2. 图像配准融合(一)——基于互信息的图像配准方法(c++)
  3. 【9106】天使的起誓
  4. 最新易发卡PJ免授权版源码
  5. Unreal Engine 4(UE4)下载教程
  6. java项目组成与理解
  7. 旋转矩阵和变换矩阵的概念和区别
  8. Redis数据类型——hash
  9. 彻底搞懂BLDC与PMSM的区别
  10. GCN变体-graphSAGE