问题描述 在支持触屏的设备中,我们经常会用到双指缩放的功能。 这里我们不讨论双指缩放的触发逻辑,我们假设双指缩放已经发生了,而且我们知道上一次两个触摸点的坐标(p0, p1),以及当前两个触摸点的坐标(p0’,p1’),我们讨论一下缩放的相关参数应该怎么计算。 常见解法 最常见的方法是,计算上一次两个点(p0, p1)之间的距离d0,以及当前两点(p0’,p1’)之间的距离d1,然后计算缩放值s = d1/d0。我们知道,当我们对一个可视对象进行缩放时,默认是以对象的本地坐标系的坐标原点进行缩放的,所以,我们还要计算缩放的中心点,否则缩放结果并不是我们预期的效果。缩放中心点也很好算,我们可以取当前两个点的中心点作为缩放的中心点,p = (p0’ + p1’) / 2。 常见解法中的问题 场景1
当我们固定一个一个手指,只移动另一个手指的时候,我们想要的结果是:固定的手指处应该是不动的。上面的方法是以两个手指的中心点为缩放中心,显然是达不到预期的效果的。
场景2当我们将两个手指同时移动,并保持两个手指之间的间距不变时,场景跟随手指移动才比较合理。按照上面的方法,场景不会有任何变化,显然不是我们想要的效果。
对于第一种,可能会提出这样一种方法,判断如果一个手指不动,就以不动的手指为中心进行缩放。 对于第二种,可能会提出这样一种方法,先提取两个手指的公共偏移量,用作平移,减去公共偏移量之后,再计算缩放。