当前位置:编程学习 > wap >>

Windows Phone 7 开发探索笔记1——触控操作之Touch

 在Silverlight for Windows Phone中,我们有多种方法来获取设备触摸信息并对其进行控制。与此最密切相关的是以下几个事件和定义在 UIElement中的 ManipulationStarted,ManipulationDelta 和 ManipulationCompleted。本节只讲解Touch.FrameReported事件。

一.Touch.FrameReported事件

    Touch.FrameReported事件提供了应用程序级的服务,是Silverlight for Windows Phone中提供的底层触控编程接口。我们可以通过它来获取操作系统或整个应用程序中每个触控点的信息。Touch是一个静态类,它只包含一个静态成员就是FrameReported事件。在程序中对此事件进行订阅时可以通过事件处理程序中的TouchFrameEventArgs参数获得我们想要的数据。

类包含以下成员(图片来自MSDN):

 

  \

    其中黄色的为TouchFrameEventArgs自身的成员。先来看GetTouchPoints方法,它会返回一个触控点的集合,当你的Windows Phone 7应用程序需要用多个手指来操作,同时你要清楚的知道每个手指所在的具体位置时它会非常有用。接下来是GetPrimaryTouchPoint方法,它返回的是主触控点(解惑主触摸点: 只有一个手指触摸屏幕时,这个触控点才叫做主(Primary)触控点。如果我们用一个手指触摸屏幕时,它一定是主点。在第一个手指仍触摸着屏幕时,将第二个手指放在屏幕上。很显然,第二个手指不是主触控点。但现在如果仍将第二个手指放在屏幕上,抬起第一个手指,然后再将其放回到屏幕上。它还是主触控点吗?不是!主触控点只会在没有其他手指触摸屏幕时才出现。)GetPrimaryTouchPoint和GetTouchPoints这两个方法都需要一个UIElement类型的参数,并且都返回与相关的信息。下面我们来看看TouchPoint类的属性:

 

  \

TouchPoint是在屏幕上触摸的手指的一个抽象。它有4个只读属性:

Action:类型为TouchAction枚举,包含3个值:Down,,Move和Up

Position:类型为Point,它是相对于引用元素的左上角而言的,这里说的引用元素就是刚才提到的GetPrimaryTouchPoint和GetTouchPoints的UIElement参数,如果传入的参数是null,那么得到的Position就是相对于屏幕的左上角的(在传入非null值时,Position中的数据很有可能会是负的)。

Size:类型是Size,它是要计算出屏幕中被触摸的一个矩形区域,不过这个属性好像并不能获取有效的值,在我的演示程序中它的Width和Height属性始终是1(也许是因为在模拟器上运行的原因)。

TouchDevice:类型TouchDevice,它包含2个只读属性:一个用于区分不同手指的int型Id属性,以及一个UIElement类型的DirectlyOver属性,它是紧贴手指的最上层UI元素。注意:如果我们需要在多个手指之间进行区分,Id属性是至关重要的。在特定的手指触摸屏幕时,与该手指关联的一系列特定事件总是以Down操作开始,接着是 Move 事件,最后是 Up 事件。所有这些事件都将与相同的Id关联。(但大家不要认为主触控点的 Id 值总是0或1,虽然在我的演示程序中它始终是0。)

    现在让我们来整理一下思路:在订阅Touch.FrameReported后,通过调用事件处理程序中TouchFrameEventArgs类型参数的GetPrimaryTouchPoint和GetTouchPoints方法来获得相应的触控点数据。GetPrimaryTouchPoint返回的是TouchPoint,GetTouchPoints返回的是TouchPointCollection(此集合包含0个或多个TouchPoint)。从TouchPoint相应的属性中我们可以获取到更细致的数据,请看下面的代码:

代码
    public MainPage()
        {
            InitializeComponent();

            Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
        }


        void Touch_FrameReported(object sender, TouchFrameEventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            // 传入null表明获取到的触控点信息是以屏幕左上角为原点的。
            var primaryPoint = e.GetPrimaryTouchPoint(null);

            if (primaryPoint != null)
            {
                // 列出主触控点的位置。
                sb.Append("Position: X:" + primaryPoint.Position.X.ToString() + " Y:" + primaryPoint.Position.Y.ToString() + "\n");

                // 列出主触控点的动作。
                sb.Append("Action: " + primaryPoint.Action.ToString() + "\n");

                // 列出主触控点的设备。
                sb.Append("TouchDeviceId: " + primaryPoint.TouchDevice.Id.ToString() + "\n");

                // 列出主触控点紧贴手指的UIElement元素。
                sb.Append("DirectlyOver: " + (primaryPoint.TouchDevice.DirectlyOver as FrameworkElement).Name + "\n");

                // 列出主触控点的区域范围信息(这个属性并不能提供有用的值)。
                sb.Append("Size: Width:" + primaryPoint.Size.Width.ToString() + " Height:" + primaryPoint.Size.Height.ToString() + "\n");

                Debug.WriteLine(sb.ToString());
            }

            // 传入null表明获取到的触控点信息是以屏幕左上角为原点的。
            var points = e.GetTouchPoints(null);

            if (points != null)
            {
                // 列出所有触
补充:移动开发 , Windows Phone ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,