如何在图片切换器中启用捏合缩放?

6
应用程序界面包括以下内容:
  1. 一个填满整个屏幕的图像切换器。
  2. 一个“下一个”按钮。
  3. 一个“上一个”按钮。
如何在图像切换器中使用“捏缩放”(pinch zooming)?
1个回答

0

实现捏合缩放手势

捏合缩放手势类似于拖动手势,但它是在第二个手指按到屏幕上时开始的(ACTION_POINTER_DOWN)。

case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // ... } else if (mode == ZOOM) { float newDist = spacing(event); Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break;

当我们获取第二个手指的按下事件时,我们计算并记住两个手指之间的距离。在我的测试中,Android有时会告诉我(不正确地)几乎完全相同位置有两个手指按下。因此,我添加了一个检查来忽略距离小于某个任意像素数的事件。如果它比那更大,我们就记住当前的变换矩阵,计算出两个手指的中点,并开始缩放。

当在缩放模式下收到移动事件时,我们再次计算两个手指之间的距离。如果太小,则忽略该事件;否则,我们还原变换矩阵,并围绕中心缩放图像。

缩放只是新距离除以旧距离的比率。如果新距离较大(即手指间距变大),则比例将大于1,使图像变大。如果它更小(手指更靠近),则比例小于1,使图像变小。当然,如果一切都相同,则比例等于1,图像不会改变。

现在让我们定义spacing()和midPoint()方法。

两点之间的距离

为了找出两个手指之间的距离,我们首先构造一个向量(x,y),它是这两个点之间的差异。

然后我们使用欧几里得距离公式来计算间距:

private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}

点的顺序并不重要,因为当我们平方时,任何负号都会消失。请注意,所有的数学运算都是使用Java的浮点类型完成的。虽然一些Android设备可能没有浮点硬件,但我们不需要担心其性能问题,因为这个操作并不频繁。

两点的中点

计算两点之间的中点甚至更容易:

private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
我们所做的就是取它们的X和Y坐标的平均值。为了避免垃圾回收导致应用程序出现明显的暂停,我们重复使用一个现有对象来存储结果,而不是每次分配并返回一个新对象。
现在尝试在您的手机上运行该程序。 用一根手指拖动图像,并通过用两个手指捏合或拉伸图像进行缩放。 为了获得最佳效果,请不要让手指相距太近。否则,您将开始遇到我之前提到的一些API中的错误。 这是《Hello, Android 3rd edition》一书的摘录,由Pragmatic Bookshelf出版。欲了解更多信息或购买平装本或PDF副本,请访问 http://www.pragprog.com/titles/eband3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接