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); }