
2.3.3 辨别缩放与旋转手势
一个手指的滑动只能识别手势的滑动方向,两个手指的滑动才能识别更复杂的手势动作。比如两个手指张开可表示放大操作,两个手指并拢可表示缩小操作,两个手指交错旋转表示旋转操作,而旋转方向又可细分为顺时针旋转和逆时针旋转。
那么如何辨别手势的缩放与旋转动作呢?由于两个手指各有自己的按下与松开事件,都有对应的触摸起点和终点,因此只要依次记录两个手指的起点和终点坐标,根据这四个点的位置关系就能算出手势的动作类别。至于缩放手势与旋转手势的区分,则需分别计算第一个手势起点和终点的连线,以及第二个手势起点和终点的连线,再判断两根连线是倾向于在相同方向上缩放还是倾向于绕着连线中点旋转。
按照上述思路编写双指触摸视图的关键代码:
(完整代码见event\src\main\java\com\example\event\widget\MultiTouchView.java)


然后在布局文件中添加MultiTouchView节点,并在对应的活动页面调用setSlideListener方法设置手势滑动监听器,看看是缩放手势还是旋转手势(判定算法参见图2-22)。

图2-22 缩放手势与旋转手势的区域判定
假设手势的起点位于图2-22的中心位置,如果手势的终点落在图2-22的左下角或者右上角,则表示本次为缩放手势;如果手势的终点落在图2-22的左上角或者右下角,则表示本次为旋转手势。据此编写的判定算法代码如下:
(完整代码见event\src\main\java\com\example\event\ScaleRotateActivity.java)

运行并测试该App,手势滑动效果如图2-23和图2-24所示。图2-23为缩放手势的检测结果,图2-24为旋转手势的检测结果。

图2-23 缩放手势的检测结果

图2-24 旋转手势的检测结果