Windows phone 支持至少四个触点, 这些手指相互作用形成multi-touch
在Silverlight程序中 touch输入通过事件获得,在XNA程序中,通过在Update方法中的一个静态类 轮询 获得 。 XNA更新方法的一个主要目的是判断touch输入状态,并且通过Draw方法在屏幕做出相应反应
Multi-touch 输入设备在XNA中 被叫做 touch panel
在XNA中可以使用 TouchPanel 静态类获得touch输入。
可以通过Toupanel.GetCapabilities 方法获得multi-touch设备的信息,该方法返回一个TouchPanelCapabilities对象,这个对象有两个属性 IsConnected和maximumTouchCount(触点数量,至少四个)
通过TouchPanel的GetState方法获得 TouchCollection,TouchCollection是一个或多个TouchLocation对象的集合,TouchLocation有三个属性
state: 是一个枚举值 Pressed,Moved,Released.
Postion: 是一个Vector2,表示触点在屏幕上相对于左上角的一个坐标
Id: 是一个整数 ,标志一个指定的手指触点
Touch过程:
如果没有手指接触屏幕,TouchCollection将会是empty,当手指第一次touch屏幕,TouchCollection将会包含一个State属性等于Pressed的TouchLocation对象,随后调用TouchPanel.GetState的时候,TouchLocation的State属性值将会变成 Moved,即是手指没有发生物理的移动,当手指从屏幕上松开的时候,TouchLocation的State属性将会编程Released,随后调用TouchPanel.GetState的时候 TouchCollection将会变成空。
上面是一个手指touch屏幕的过程,一般情况下会有多个手指touch,这时候可以通过TouchLocation的Id属性来获取指定手指的状态变化
异常:如果 手指 按下和释放 的时间间隔小于1/30秒,TouchLocation的状态可能只有Pressed 和 Released ,没有Moved状态
TouchLocation 有一个TryGetPreviousLocation的方法,当 touchLocation的状态变成下一个状态时,可以获得上一个状态的位置信息,然后计算 他们的不同
TouchLocation PreviousTouchLocation;
Bool success=touchLocation.TryGetPreviousLocation(out previousTouchLocation);
如果 当前状态是 Pressed 上面的函数将会返回false TouchLocation.State 将会等于 TouchLocation.Invalid
Gesture
GestureType枚举了一些手势类型,他们通过位标记来定义,所以可以通过C#进行位操作
这些Gesture通过TouchPanel.ReadGesturel 来获得 返回值类型是GestureSample
使用该方法的话,程序会在手指离开时做出相应的相应,因为程序要判断用户到底要做什么操作
在SilverLight程序中
Low-level touch: Touch 是由 Touch.FrameReported 事件来处理
High-level touch: 接口是由由三个UIElement类下的事件组成:ManipulationStarted,ManipulationDelta 和 ManipulationCompleted
Silverlight中low-level touch接口的Touch核心是 TouchPoint类 他的实例表示一个特殊的 finger touching the screen 他有四个只读属性
Action 类型是TouchAction
Position 类型是point 相对于左上角的坐标,这个元素就是参照元素
Size 表示touch区域(力度等)
TouchDevice 包括两个只读属性 Id 用来区分不通的手指动作 DirectlyOver 表示手指下面最上端的元素
在应用程序中的所有的touch事件, TouchFrameEventArgs对象有一个时间戳 TimeStamp属性,和三个方法,
GetTouchPoints 返回一个TouchPointCollection;
GetPrimaryTouchPoint 返回一个TouchPoint如果传进去一个参照元素 返回值将会是相对于该元素,若传进来的是null 将会是相对于应用程序的左上角;
SuspendMousePromotionUntilTuchUp 该方法仅仅可以在是第一次touch屏幕的并且只有一个手指touch时候才可以调用
推荐的touch targets 的大小应该大于9毫米 对于显示是264DPI的手机 9毫米是94px
e.Complete 方法 这不是必须的方法,但是是一个有效的方法告诉系统不必要再进一步执行有关于这个手指的Manipulation事件
e.Handled=true; 表示该事件已经被处理,不要再执行下面的函数