Android 如何在图像切换器中启用收缩缩放?
应用程序的界面由以下项目组成Android 如何在图像切换器中启用收缩缩放?,android,pinchzoom,imageswitcher,Android,Pinchzoom,Imageswitcher,应用程序的界面由以下项目组成 填充整个屏幕的图像切换器 一个next按钮 一个上一个按钮 如何使用图像切换器中的收缩缩放?实现收缩缩放手势 捏缩缩放手势与拖动手势类似,不同之处在于它是在食指按到屏幕上时开始的(操作指针向下) case MotionEvent.ACTION\u指针\u向下: oldDist=间距(事件); Log.d(标记“oldDist=“+oldDist”); 如果(旧区>10f){ savedMatrix.set(矩阵); 中点(中点,事件); 模式=缩放; Log.d(标
next
按钮上一个按钮
如何使用
图像切换器中的收缩缩放
?
实现收缩缩放手势
捏缩缩放手势与拖动手势类似,不同之处在于它是在食指按到屏幕上时开始的(操作指针向下
)
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
Log.d(标记“oldDist=“+oldDist”);
如果(旧区>10f){
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
Log.d(标记“mode=ZOOM”);
}
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动){
// ...
}
else if(模式==缩放){
float newDist=间距(事件);
Log.d(标记“newDist=“+newDist”);
如果(新距离>10f){
矩阵集(savedMatrix);
浮动比例=新距离/旧距离;
矩阵。后标度(标度、标度、中x、中y);
}
}
打破
当我们得到第二个手指的向下事件时,我们计算并记住两个手指之间的距离。在我的测试中,Android有时会(错误地)告诉我,有两个手指被压在几乎完全相同的位置。因此,我添加了一个检查,如果距离小于任意数量的像素,则忽略该事件。如果大于该值,我们记住当前变换矩阵,计算两个手指的中点,然后开始缩放
当移动事件在缩放模式下到达时,我们再次计算手指之间的距离。如果太小,事件将被忽略,否则我们将恢复变换矩阵并围绕中点缩放图像
比例只是新距离除以旧距离的比率。如果新的距离更大(即手指之间的距离更远),则比例将大于1,使图像更大。如果它更小(手指靠得更近),则比例将小于1,从而使图像更小。当然,如果一切都一样,比例等于1,图像不变
现在让我们定义spacing()和Middpoint()方法
两点之间的距离
为了找出两个手指之间的距离,我们首先构造一个向量(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);
}
专用浮动间距(MotionEvent事件){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回FloatMath.sqrt(x*x+y*y);
}
点数的顺序并不重要,因为当我们将它们平方时,任何负面符号都将丢失。注意,所有的计算都是使用Java的float类型完成的。虽然一些安卓设备可能没有浮点硬件,但我们这样做的频率还不足以让人担心其性能
两点中点
计算两点中间的点更容易:
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); } 专用空心中点(点F点、MotionEvent事件){ float x=event.getX(0)+event.getX(1); float y=event.getY(0)+event.getY(1); 点集(x/2,y/2); } 我们所做的就是取它们的X和Y坐标的平均值。为了避免垃圾收集导致应用程序中出现明显的暂停,我们重用现有对象来存储结果,而不是每次分配并返回一个新对象。 现在尝试在手机上运行该程序。用一个手指拖动图像,然后通过向内或向外捏两个手指来缩放图像。为了获得最佳效果,手指之间的距离不要超过一英寸左右。否则,您将开始在我前面提到的API中遇到一些bug 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); }