应用程序的界面由以下项目组成。
- 一个填满整个屏幕的图像切换器。
- 一个
next按钮。 - 一个
previous按钮。
我怎样才能使用pinch zooming中的image Switcher?
应用程序的界面由以下项目组成。
next按钮。previous按钮。我怎样才能使用pinch zooming中的image Switcher?
实现捏缩放手势
捏缩放手势类似于拖动手势,不同之处在于它在第二根手指按下屏幕时开始 ( ACTION_POINTER_DOWN)。
案例 MotionEvent.ACTION_POINTER_DOWN:
oldDist = 间距(事件);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
保存矩阵.set(矩阵);
中点(中点,事件);
模式=缩放;
Log.d(TAG, "mode=ZOOM" );
}
休息;
案例 MotionEvent.ACTION_MOVE:
如果(模式==拖动){
// ...
}
否则 if (mode == ZOOM) {
浮动 newDist = 间距(事件);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
浮动比例 = newDist / oldDist;
matrix.postScale(规模,规模,mid.x,mid.y);
}
}
休息;
当我们得到第二根手指的向下事件时,我们计算并记住两根手指之间的距离。在我的测试中,Android 有时会(错误地)告诉我有两个手指在几乎完全相同的位置被按下。因此,如果距离小于任意数量的像素,我添加了一个检查以忽略该事件。如果比那个大,我们记住当前的变换矩阵,计算两个手指的中点,开始缩放。
当我们在缩放模式下移动事件到达时,我们再次计算手指之间的距离。如果太小,则忽略该事件,否则我们恢复变换矩阵并围绕中点缩放图像。
比例尺只是新距离除以旧距离的比率。如果新的距离更大(即手指之间的距离更远),那么 scale 将大于 1,从而使图像更大。如果它更小(手指靠得更近),则比例将小于 1,从而使图像更小。当然,如果一切都相同,则比例等于 1,图像不会改变。
现在让我们定义spacing() 和midPoint() 方法。
两点之间的距离
为了找出两个手指之间的距离,我们首先构造一个向量 (x, y),它是两点之间的差。
然后我们使用欧几里得距离的公式来计算间距:
私人浮动间距(MotionEvent 事件){
浮动 x = event.getX(0) - event.getX(1);
浮动 y = event.getY(0) - event.getY(1);
返回 FloatMath.sqrt(x * x + y * y);
}
点的顺序无关紧要,因为当我们将它们平方时,任何负号都会丢失。请注意,所有数学都是使用 Java 的 float 类型完成的。虽然某些 Android 设备可能没有浮点硬件,但我们这样做的频率并不足以担心其性能。
两点的中点
计算两点中间的点更容易:
私人无效中点(PointF点,MotionEvent事件){
浮动 x = event.getX(0) + event.getX(1);
浮动 y = event.getY(0) + event.getY(1);
点.set(x / 2, y / 2);
}
我们所做的只是取它们的 X 和 Y 坐标的平均值。为了避免可能导致应用程序明显暂停的垃圾收集,我们重用现有对象来存储结果,而不是每次都分配和返回一个新对象。现在尝试在您的手机上运行该程序。用一根手指拖动图像,并通过向内或向外捏合两指来放大图像。为了获得最佳效果,不要让您的手指之间的距离超过一英寸左右。否则,您将开始遇到我之前提到的 API 中的一些错误。
这是实用书架出版的 Hello, Android 3rd edition 的节选。如需更多信息或购买平装本或 PDF 副本,请访问 http://www.pragprog.com/titles/eband3