专栏首页知晓程序在小程序里实现手势缩放,你可以这样做 | 实战教程

在小程序里实现手势缩放,你可以这样做 | 实战教程

文 | 严灏

上周,知晓程序向大家分享了「知了地铁」小程序的上手体验。同时,我们也在这篇文章中提过,会与大家讨论有关小程序中手势缩放功能的实现。

关注知晓程序(微信号 zxcx0101),回复「知了地铁」,看「知了地铁」小程序上手体验文章。

在开发「知了地铁」小程序的时候,我们发现:在几寸的手机屏幕上完整显示地铁线网图,用户就很难看清细节;而默认将线网图按照 1:1 模式显示出来,用户需要多次拖动才能看到线网图的概况。

很明显,两种实现方式的体验,都非常糟糕。

因此,如果要在小程序中展示带有细节信息的图片(例如地铁线网图),就需要为其加上缩放功能。而用双指张合手势进行缩放,是大部分智能手机用户都已经习惯了的缩放方法。

今天,知晓程序就为大家带来有关手势缩放功能的实现方法,以及手势缩放实现在小程序中的局限和问题。

手势动态检测

首先,我们需要获得用户的触摸事件。只有获得了这个事件,小程序才能得知用户希望缩放图片,同时确定图片的缩放倍数。

我们发现微信提供 touchmove 事件,在用户触摸屏幕并在屏幕上移动手指时,这个事件就会被触发。

手势缩放的核心思想是:根据两只手指相对距离的变化,对图片进行放大或缩小。因此,我们需要知道两只手指相对距离的变化值,才能让图片按预期缩放。

touchmove 事件可以实现的功能,大致可以总结为:

  • 手指在屏幕上进行移动时,touchmove 事件就会以 16 ms 一次的频率不断被触发;
  • 手指离开屏幕时,touchend 事件会被触发。

touchmove 事件所包含的事件对象中有一个 touches 属性,此属性为当前停留在屏幕中的触摸点信息的数组。触摸点的信息包括:

  • identifier:触摸点的标志符;
  • pageXpageY:距离文档左上角的距离;
  • clientXclientY:距离屏幕可显示区域左上角距离。

我们可以通过不断获取 clientXclientY 数据的方式,来确定手指在屏幕上的位置变化。

distance 变量即为两只手指之间的距离。在 touchmove 被触发的时候,小程序就会计算一次 distance

我们为新的 distance 变量定名为 newDistance,相应地,旧变量定名为 oldDistance

之后,我们设定一个新的变量 distanceDiff = newDistance - oldDistance,它反映两次 touchmove 触发瞬间,两根手指相对距离的变化值。

distanceDiff 为正数时,表示两指间距离在变大,图片需要被放大;反之,则代表两指间距缩小,图片需要被缩小。

图片动态缩放

到这里,我们已经可以探测用户的手指距离变化了。接下来,我们需要根据用户的手势,确定图片缩放倍数,然后根据倍数缩放图片。

首先,要确定 distance 的变化值与图片放大或缩小的变化率相关联的规则。

我们将图片正常显示时的尺寸定为基准值,存放于变量 baseWidthbaseHeight 中;将图片需要放大的倍数设置为变量 scale,它的初始值和最小值为 1,最大值可根据需要来设置。

经过多次试验,我们最后确定了一个公式:

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

现在,我们为图片对象绑定 touchmove 事件。在每次 touchmove 被触发后,我们都可以计算出新的图片需要被放大的倍数,我们将这个变量定名为 scale

具体方式是:在每次 touchmove 被触发后,通过探测手指距离变化而得到的数据,来得到图片按比例缩放后的高宽值。

接下来,我们在 WXML 中,将图片对象的高和宽绑定相应的动态值,我们就能实现手势缩放功能了:

scroll-view,还是用 view

实现了图片的缩放之后,我们还需要一个容器存放图片。微信为视图组件提供了 scroll-viewview 两种容器。但在目前阶段,两种容器都不能非常完美地实现手势缩放功能。

我们原本使用的方案是:利用 scroll-view,设置 scroll-xscroll-y 属性为 true。这可以在放大后滑动浏览图片时,拥有良好的浏览体验。

但是,我们发现 scroll-view 组件还存在缩放时出现界面闪动的现象的 bug。用双指手势缩放存在 scroll-view 容器中的图片,极易触发此 bug。

此问题只能等待微信官方进行修复。但在目前阶段,开发者也可以选择:

  • 放弃 scroll-view,转而使用不带有良好滑动体验的 view 组件;
  • 放弃使用手势缩放功能,转而开发「放大 - 缩小」按钮组件,或双击放大/缩小的功能。

以上就是知晓程序(微信号 zxcx0101)带来的手势缩放图片功能的实现教程。虽然目前手势缩放并不能完美实现,但也希望大家可以举一反三,通过这个思路,创造出体验更好的小程序。

如果你希望讨论有关小程序开发中的问题,关注知晓程序(微信号 zxcx0101)并点击菜单栏中的「加群交流」,就能获得加入知晓程序开发讨论群的方式,与大家一同讨论小程序开发。

本文分享自微信公众号 - 知晓程序(zxcx0101),作者:让你更知小程序的

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 中国第一大报做了个小程序,用微信也能关心国家大事 | 国家队 #1

    知晓君
  • 想和时间做朋友?这 5 个小程序你一定会喜欢!

    那是一个雨天的下午,一名 15 岁的洛杉矶少年,在一张黄色便条上写下了 My Life List(生命清单),列出了他人生的 127 个目标。

    知晓君
  • 设计师必备!用这个小程序,给甲方一点「颜色」瞧瞧

    想成为一个好的设计师,或者一个很会穿搭的人。在设计作品或是穿搭衣物时,决不能配错颜色。

    知晓君
  • 谷歌开源缩放模型EfficientNets:ImageNet准确率创纪录,效率提高10倍

    最近,谷歌基于AutoML开发了EfficientNets,这是一种新的模型缩放方法。它在ImageNet测试中实现了84.1%的准确率,再次刷新了纪录。

    量子位
  • 微服务体系三维可缩放模型

    X轴缩放包括在负载均衡器后面运行的应用程序的多个副本。如果有N个副本,则每个副本处理1 / N的负载。

    羽客
  • 移动端点击事件延迟的诞生消亡史

    快速反馈对于任何 UI 的实现都是至关重要的。研究表明,100ms 是界面让用户感到即时的最大延迟。尽管如此,移动网络仍然受到一个巨大的反馈问题的困扰:触摸任何...

    用户6167509
  • 谷歌开发新模型EfficientNets,缩放CNN的精度与效率超越现有模型

    卷积神经网络(CNN)通常以固定的资源成本开发,然后进行缩放,以便在获得更多资源时得到更好的精度。

    AiTechYun
  • 特征工程 特征处理

    前言:本文介绍了特征处理中的特征缩放、选择和降维,并用代码演示特征缩放中的标准化法和区间缩放法。

    DataScience
  • EfficientNet解析:卷积神经网络模型规模化的反思

    自从Alexnet赢得2012年的ImageNet竞赛以来,CNNs(卷积神经网络的缩写)已经成为深度学习中各种任务的事实算法,尤其是计算机视觉方面。从2012...

    AiTechYun
  • 基于Consul的分布式信号量实现

    在之前《基于Consul的分布式锁实现》一文中我们介绍如何基于Consul的KV存储来实现分布式互斥锁。本文将继续讨论基于Consul的分布式锁实现。信号量是我...

    程序猿DD

扫码关注云+社区

领取腾讯云代金券