应用程序的接口由以下项组成。
- 填充整个屏幕的图像切换器
next
按钮previous
按钮
如何在image Switcher
中使用pinch zooming
实现缩放手势
捏缩放手势类似于拖动手势,只是当第二根手指按到屏幕上时开始(ACTION_POINTER_DOWN
)。
案例MotionEvent.ACTION_POINTER_DOWN:oldDist=间距(事件);Log.d(TAG,"oldDist="+oldDist);如果(旧Dist>10f){savedMatric.set(matrix);中点(mid,event);mode=缩放;Log.d(TAG,"mode=ZOOM");}打破case MotionEvent.ACTION_MOVE:如果(模式==DRAG){//。。。}否则如果(模式==缩放){float newDist=间距(事件);Log.d(TAG,"newDist="+newDist);if(newDist>10f){matrix.set(savedMatrix);浮动刻度=newDist/oldDist;matrix.postScale(scale,scale,mid.x,mid.y);}}断裂
当我们得到第二根手指的向下事件时,我们计算并记住两根手指之间的距离。在我的测试中,Android有时会(错误地)告诉我,有两个手指压在几乎完全相同的位置。因此,我添加了一个复选框,如果距离小于任意数量的像素,则忽略该事件。如果它比这个大,我们记住当前的变换矩阵,计算两个手指的中点,然后开始缩放。
当我们处于缩放模式时移动事件到达时,我们会再次计算手指之间的距离。如果它太小,则忽略该事件,否则我们将恢复变换矩阵并在中点周围缩放图像。
比例尺只是新距离除以旧距离的比率。如果新的距离更大(即手指相距更远),则比例将大于1,使图像更大。如果它更小(手指靠得更近),则比例将小于1,从而使图像更小。当然,如果一切都一样,比例等于1,图像不变。
现在让我们定义spacing()和midPoint()方法。
两点之间的距离
为了找出两个手指相距多远,我们首先构造一个向量(x,y),它是两点之间的差。
然后我们使用欧几里得距离的公式来计算间距:
私有浮动间距(MotionEvent事件){float x=event.getX(0)-event.getX(1);float y=event.getY(0)-event.getY(1);return FloatMath.sqrt(x*x+y*y);}
点的顺序无关紧要,因为当我们对它们进行平方时,任何负号都会丢失。请注意,所有的数学运算都是使用Java的浮点类型完成的。虽然一些安卓设备可能没有浮点硬件,但我们这样做的频率不足以担心其性能。
两点的中点
计算两点中间的一点甚至更容易:
private void midPoint(PointF点,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。
这是《你好,安卓》第三版的节选,由实用主义书架出版。欲了解更多信息或购买平装本或PDF副本,请访问http://www.pragprog.com/titles/eband3