手指之舞(一):WP7中多点触控之我之理论

来源:互联网 发布:ios开发网络请求 编辑:程序博客网 时间:2024/04/29 00:26

WP7与以前的WM系统不同,使用的是电容屏,而且支持多点触控。本以为自带多点触控,不用自己实现,但是经过尝试,发现系统并不是自动实现的。而是要程序员自己去实现。经过多天探索。对多点触控有了一点认识。

经过几天探索,到发现有几种方法实现触控的。注意,是触控,多不多点另外说。一种是silverlight的低级别触摸屏事件,XNA上的低级别事件与之差不多。另外的是高级别的UIElement类的三个处理事件:ManipulationStarted, ManipulationDelta, ManipulationCompleted。

先说下触点的基本知识:

多点触控支持多个手指同时触摸屏幕,触摸屏幕的每个手指(数量存在上限)都是一个触摸点。主要触摸点是指在没有其他手指触摸屏幕并且未按下鼠标按钮时触摸屏幕的手指。

用一个手指触摸屏幕。这是主要触摸点。在第一个手指仍触摸着屏幕时,将第二个手指放在屏幕上。很显然,第二手指不是主要触摸点。但现在仍将第二个手指放在屏幕上,抬起第一个手指,然后再将其放回到屏幕上。这是主要触摸点吗?不,都不是。仅当没有其他手指触摸屏幕时,才会出现主要触摸点。

主要触摸点将映射到不会提升为鼠标的触摸点。在实际的多点触控应用程序中,您应该注意不要依赖主要触摸点,因为用户通常不会重视第一次触摸的特定意义。


(一)silverlight低级别触摸屏事件

这个事件就是注册一个Touch的FrameReported事件:(可以在PageLoaded里面注册)

Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);


然后再Touch_FrameReported下实现触点处理:

void Touch_FrameReported(object sender, TouchFrameEventArgs args)        {//第一个手指接触点,也就是主触摸点            TouchPoint primaryTouchPoint = args.GetPrimaryTouchPoint(null); //禁止该时间被提升为鼠标事件,即处理触控的时候防止同时触发鼠标的点击事件            if (primaryTouchPoint != null && primaryTouchPoint.Action == TouchAction.Down)            {                args.SuspendMousePromotionUntilTouchUp();            }        }


上面代码的TouchPoint中有个成员是TouchDevice,其中有个Id的成员,这个可以显示当前是那个手指触控的,也就是一根手指放在屏幕上一次就会有一个Id,离开后Id就销毁。一般主要触摸点的Id为0,接着第二根手指产生的Id是1,第三根是2,如果都离开后,又从0开始计数。

在这里可以取到所有的触摸点,并不是仅仅能取到主要触摸点,返回的是TouchPointCollection

TouchPointCollection touchPoints = arg.GetTouchPoints(null);


通过查询TouchPoint,我们就可以得到触摸点的所有信息。比如有个Action成员,我们可以知道现在手指是在移动还是按下还是抬起。通过Position,可以知道现在手指在屏幕上的坐标。通过Id,可以知道哪些触点是同一手指出发的。


另外,这个FrameReported注册事件是对于程序而言的,不是对于页面的,如果想在其他页面不使用这些触控方法,可以在页面离开的时候取消注册事件


(二)silverlight高级事件---UIElement的Manipulation事件。

ManipulationStarted, ManipulationDelta, ManipulationCompleted这三个事件,其实看名字就知道了。简单来说第一个是开始,也就是开始触摸,第二个是拖动,相当于TouchPoint.Action == TouchAction.Move。第三个就是停止,就是手指离开屏幕。这三个事件用起来挺方便的。不像低级触摸屏处理事件。还得分别TouchPoint.TouchDevice.DirectlyOver是哪个控件。但是,经过我多次测试(真机测试,HTC T8788),发现这个所谓的高级事件居然只是接受第一个触点,也就是主要触摸点。如果不是主要触摸点,它就不工作了。但是,按照微软的一贯做法,高级事件其实就是低级事件的封装,不可能不再支持多点触控的啊。查看网上,也没啥详细的说法,只是说实现多点和单点只是处理参数的不同。如果有人知道,麻烦给了例子。谢谢!

不过,这三个事件来处理控件的触摸,来处理特殊的触摸动作,做些其他很特别的事情,还是很方便的。