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

时间:2012-11-25 16:17:31

标签: android pinchzoom imageswitcher

应用程序的界面包含以下项目。

  1. 填满整个屏幕的图像切换器。
  2. next按钮。
  3. previous按钮。
  4. 如何使用pinch zooming中的image Switcher

1 个答案:

答案 0 :(得分: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的float类型完成的。虽然有些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中的一些错误。

This is an excerpt from Hello, Android 3rd edition, published by the Pragmatic Bookshelf. For more information or to purchase a paperback or PDF copy, please visit http://www.pragprog.com/titles/eband3