代码改变世界

WP7备注(7)(TouchLocation接触点与Gesture手势)(Silverlight)(大部分不同网站复制)

2011-04-26 16:26  血糯米Otomii  阅读(529)  评论(0编辑  收藏  举报

触摸帧事件(底层):

Touch.FrameReported += OnTouchFrameReported;

void OnTouchFrameReported(object sender, TouchFrameEventArgs args){}

TouchFrameEventArgs:

触摸帧事件具有一个TouchFrameEventArgs对象

此对象拥有3个方法

1.TouchPoint GetPrimaryTouchPoint(UIElement relativeTo),获取主触点

2.TouchPointCollection GetTouchPoints(UIElement relativeTo),获取所有触电

3.SuspendMousePromotionUntilTouchUp(),禁止该时间被提升为鼠标事件

TouchPoint:

TouchPoint类定义以下四个只读属性,这些属性都由依赖属性支持:

Action 属性,类型为 TouchAction(一个具有 Down、Move 和 Up 成员的枚举)。
Position 属性,类型为 Point,它相对于作为参数传递给 GetPrimaryTouchPoint 或 GetTouchPoints 方法的元素(或相对于参数为 null 的应用程序的左上角)。
Size 属性,类型为 Size。

TouchDevice 属性,类型为 TouchDevice。

TouchDevice 对象具有两个也由依赖属性支持的只读属性:

DirectlyOver 属性,类型为 DirectlyOver(手指下最上面的元素)。
Id 属性,类型为 int。
DirectlyOver 不必是传递给 GetPrimaryTouchPoint 或 GetTouchPoints 的元素的子项。如果手指在 Silverlight 应用程序内(由 Silverlight 插件对象的尺寸定义),但不在可点击测试控件覆盖的范围内,则此属性可以为空。(具有空背景刷的面板不可点击测试。)

若要在多个手指之间区分,ID 属性至关重要。在特定手指触摸屏幕时,与该手指关联的一系列特定事件总是以 Down 操作开始,接着是 Move 事件,最后是 Up 事件。所有这些事件都将与相同的 ID 关联。(但不要以为主要触摸点的 ID 值将为 0 或 1。)

大多数重要的多点触控代码都会使用 Dictionary 集合,其中 TouchDevice 的 ID 属性是字典键。这是跨事件存储特定手指信息的方式。

手势触发事件(基于UI):

ManipulationStarted:手指碰触开始

ManipulationStartedEventArgs:

args.OriginalSource:类型为object,它是定义在RoutedEventArgs类中的,通过它我们可以获取到触发这个事件的原始对象。
args.ManipulationContainer:类型为UIElement,可以获取到定义当前这个触控操作坐标的对象(通常与OriginalSource是相同的)。
args.ManipulationOrigin:类型为Point。获取操作的起源坐标,即手指触摸到的那一点的坐标,此坐标的数值就是相对于ManipulationContainer对象左上角的。如果有两个或多个手指在操作一个元素,那么ManipulationOrigin 属性会给出多个手指的平均坐标。

args.Complete()可以使此次Manipulation进入完成状态

并且ManipulationStarted为一个Routed Event,可以使用args.Handle = true;来结束事件继续路由

ManipulationDelta:手指移动

除了OriginalSource,ManipulationContainer,ManipulationOrigin,Complete外,这个类还包含2个ManipulationDelta类型的属性:CumulativeManipulation和DeltaManipulation。都拥有Scale和Translation属性.

Scale和Translation属性帮我们将一个或多个手指在某个元素上的复合动作解析成了元素自身的移动和尺寸变化。Scale表示的是缩放因子,Translation表示的是平移的距离。我们用一个手指操作时就可以改变Translation的值,但如果要改变Scale需要用两个手指操作。当你手指在一个元素上移动时,手指所在的新位置和原来位置的差值就会反映在Translation中。如果是用两个手指进行缩放,原来手指之间的距离与缩放后手指间距离差值会反映在Scale中。

下面来说CumulativeManipulation属性和DeltaManipulation属性的区别:虽然这两个属性都包含Scale和Translation。但CumulativeManipulation中的值是从ManipulationStarted事件开始到当前事件为止累加得到的(通过属性的名字就可以看出来),而DeltaManipulation中的值是本次ManipulationDelta事件相对于上一次ManipulationDelta或ManipulationStarted事件而言的,是单次的改变。

IsInertial为惯性,Velocities为加速度

ManipulationCompleted:手指碰触结束

除了OriginalSource,ManipulationContainer,ManipulationOrigin外,还包含下面3个属性:
FinalVelocities:类型和ManipulationDeltaEventArgs类中的Velocities一样,都是ManipulationVelocities,通过它可以获取手指离开屏幕时的速度。
IsInertial:类型为bool,和ManipulationDeltaEventArgs类中的IsInertial一样
TotalManipulation:类似于ManipulationDeltaEventArgs类的CumulativeManipulation,类型也是ManipulationDelta,它是从ManipulationStarted事件到ManipulationCompleted事件全过程的累加值。