随着技术的发展,多触点技术已经成为现代用户界面设计中的一个重要元素。Windows 7操作系统和.NET 4.0框架为开发者提供了强大的支持,使得多触点编程变得更加容易和直观。本文将通过一个多触点控制机器人的示例应用,展示如何在Windows 7环境下使用.NET 4.0和WPF 4.0进行多触点编程。
当Visual Studio 2010 beta 2版本首次发布时,立刻下载并安装了它。一直在思考,这个新版本能为带来哪些新的可能性?多触点技术无疑是首先想到的。对新的多触点支持感到非常兴奋。只是刚开始探索(呵呵)使用多触点技术创造新的应用程序界面。相信,像这样的开发者将会创造出许多酷炫的新用户体验。
首先,需要一个滑动条控件,所以创建了一个名为SliderControl.XAML的WPF用户控件。给它添加了一个漂亮的圆角边框和一个线性渐变填充。然后,添加了一个椭圆形作为控制旋钮,供用户与之交互。
当手指首次触摸屏幕时,会触发TouchDown事件。在TouchEventArgs中,将获得一个TouchDevice对象,该对象包含多触点硬件为当前触摸分配的ID。可以在后续代码中使用此ID来跟踪触摸。但是,还有其他方法可以为捕获触摸。
当手指从屏幕上抬起时,会触发TouchUp事件。将获得另一个TouchDevice对象,以便可以释放对当前触摸的任何捕获。
当在屏幕上拖动手指时,TouchMove事件会被多次触发。屏幕上每个手指的移动都会触发一个单独的事件。不能保证事件到达的顺序。这就是TouchDevice.ID重要的原因。
要检测和捕获触摸事件,首先需要在SliderControl的构造函数中钩住事件处理程序。将注意到钩住了用户控件的TouchDown和TouchUp事件,但钩住了椭圆形的TouchMove事件。这是因为椭圆形最终将捕获TouchMove事件并处理它们。
this.TouchDown += new EventHandler(SliderCtrl_TouchDown);
this.TouchUp += new EventHandler(SliderCtrl_TouchUp);
this.elSlider.TouchMove += new EventHandler(elSlider_TouchMove);
当TouchDown事件触发时,希望确定它是否发生在控制旋钮上,在这个例子中是椭圆形。如果TouchDevice.DirectlyOver对象返回的是椭圆形,那么只要椭圆形还没有捕获另一个触摸,就会捕获触摸。
private void SliderCtrl_TouchDown(object sender, TouchEventArgs touchEventArgs)
{
// 如果触摸发生在椭圆形上,则捕获TouchDevice
if (touchEventArgs.TouchDevice.DirectlyOver == this.elSlider)
{
if (this.elSlider.TouchesCaptured.Count() == 0)
{
this.elSlider.CaptureTouch(touchEventArgs.TouchDevice);
touchEventArgs.Handled = true;
}
}
}
在TouchDevice被椭圆形捕获后,TouchMove事件处理程序将接收到该触摸的所有移动数据。因此,只需获取当前位置,进行所需的计算,并等待下一个TouchMove事件。使用位置数据来设置椭圆形的Top属性。还添加了代码来限制它在屏幕上的移动范围,根据位置计算一个归一化值,并触发一个名为ValueChanged的事件。
private void elSlider_TouchMove(object sender, TouchEventArgs touchEventArgs)
{
double position = touchEventArgs.GetTouchPoint(this).Position.Y - 30;
if (position > MIN_VAL && position < MAX_VAL)
{
this.elSlider.SetValue(Canvas.TopProperty, position);
CalcCurrentValue(position);
this.txtVal.Text = string.Format("{0:F2}", this._curValue);
this.OnValueChanged(this, this._emptyArgs);
}
touchEventArgs.Handled = true;
}
当从屏幕上抬起一个手指时,会得到一个TouchUp事件。在这里,将确定该TouchDevice是否被椭圆形捕获。如果是这样,那么释放它,将椭圆形居中在滑块上,并发送另一个ValueChanged事件。
private void SliderCtrl_TouchUp(object sender, TouchEventArgs touchEventArgs)
{
if (touchEventArgs.TouchDevice.Captured == this.elSlider)
{
this.elSlider.ReleaseTouchCapture(touchEventArgs.TouchDevice);
CenterSlider();
touchEventArgs.Handled = true;
this.OnValueChanged(this, this._emptyArgs);
}
}
这个应用程序的目的是为了使用多触点控制乐高NXT机器人。希望屏幕上有两个滑动条控件,可以同时独立控制每个电机。因此,每个滑动条控件都连接到触发ValueChanged事件,主应用程序将发送串行命令给NXT机器人,根据滑动条控件的位置移动每个电机向前或向后。
如果不想控制机器人,但仍然想要在应用程序中使用多触点滑动条控件,那么很容易将SliderControl.XAML用户控件提取出来并放入自己的应用程序中。可以钩住ValueChanged事件,然后就可以开始了。确实在SliderControl中添加了一个节流机制,以免它发送回值太快,NXT机器人无法处理。如果不需要它,那么很容易移除。
已经上传了一个视频到YouTube,展示了应用程序控制机器人的操作。可以在以下链接找到它:。
Windows 7使得将设备连接到笔记本电脑变得非常容易。在这种情况下,使用蓝牙连接了乐高NXT砖块。这非常简单。首先,打开NXT砖块并将其设置为通过蓝牙可见。然后,在开始菜单的控制面板下打开设备和打印机。应该在设备中看到NXT可用,一旦输入正确的密码。NXT的默认密码是'1234'。
可以双击NXT图标并查看它提供的服务。在这种情况下,它显示为一个串行端口。应用程序使用SerialPort类与NXT机器人通信。可以在乐高NXT网站上找到所有文档和直接命令。对于这个应用程序,想要控制的特定NXT的串行端口设置在App.Config文件中。只需将COM值更改为NXT使用的值,然后运行应用程序。
本文展示了如何轻松访问多触点笔记本电脑的多触点功能,使用Visual Studio 2010 beta 2和WPF 4.0。希望在未来,硬件制造商将推出更多同时触摸点的笔记本电脑。相信,仍然有许多伟大的多触点.NET应用程序等待被编写。需要硬件跟上想象力。