【Android】手势识别

  最近的项目和Android的手势识别以及多点触控息息相关,我觉得应该是最为繁琐的需求了,在这里必须对所有的相关技术做一个深入的了解以及总结才能驾驭好实现过程。其中还涉及到缩放以及各种相关的东东,将笼统的写在一起。

  首先讲述一下我的需求:在一个界面上我们布置一个Gallery,Gallery里面的图片必须可以放大缩小或者拖动(手势A),Gallery本身必须可以实现左右切换(手势B),Gallery上必须可以画出线条(手势C),无论是否处于绘画状态,都能对图片实现放大缩小。

具体需求详述如下:

1)在绘画状态下

  a)单点触摸屏幕是画图;

  b)双点触摸,如果两指距离不变(在一定误差范围内),判定为移动图片;

  c)双点触摸,如果两指间距离变化(大于一定的范围),判定为缩小放大图片;

2)不在绘画状态

  a)单点触摸屏幕,可以是移动图片,也可以是左右切换图片(具体的读者可以想象,如果图片很大,超出屏幕,那么单点可以移动图片,否则类似Gallery切换)

  c)双点触摸屏幕,如果两指间距离变化(大于一定的范围),判定为缩小放大图片;

现在的问题就是,如何将手势A,B,C和谐的在一个界面里面实现。注:界面上还有一个按钮Button标记是否在绘画状态下。(请仔细阅读:【Android】Touch事件分发

  我的解决思路如下:首先,要确定好使用的组件,Gallery的左右滑动事件以及多点触控事件的响应非常的复杂,我们需要重载一个Gallery,稍后再说。其次,gallery里面装载的ImageView原本不具有放大缩小和拖动的功能,所以为了实现这一点,必须继承ImageView,定义自己的类MyImageView(注:网上流传一份代码,专门解决既能左右切换,又能放大缩小的Gallery问题,我测试了一下,代码存在一些问题,大家用的时候必须仔细理解,加以细致改造),其次就是绘图界面,我使用的是SurfaceView,因为他可以构造出透明的画布,这是我需要的。

  接下来说说手势的解决:

手势在触摸屏幕的时候被识别,我们需要对相应的触摸事件做出分发,分发的第一个判断点在于:是否是处于绘画状态:

1)处于绘画状态:将事件分发到SurfaceView;

2)不处于绘画状态:将事件分发到MyGallery;

具体处理步骤详述如下:

1)按钮Button控制是否在绘画状态下的标记(一个布尔值);

2)发生触摸事件,首先判断是否在编辑状态下:

3)如果不在绘画状态下,将事件交付给gallery处理,如果在编辑状态下,将事件交付给surfaceView处理;

4)在gallery里面处理事件,我么只需要将判断事件:

  4.1)假设是单点触控,那么我们需要判断是在移动还是在切换(根据图片的位置移动)

  4.2)假设是双点触控,我们判定是在放大缩小,然后在gallery里面调用MyImageView的相应方法(注:我的MyImageView里面只有移动,放缩的方法以供调用。)

5)在surfaceView里面处理事件,我们同样需要判断事件并且更加复杂:

  5.1)假设是单点触控,那么就是绘画;

  5.2)假设是双点触控,则需要从surfaceView里面控制相应的ImageView,进行放大缩小和移动的操作,不产生切换;

 

posted @ 2012-10-05 09:55  大脚印  阅读(996)  评论(0编辑  收藏  举报