如何检查3根手指是否放在屏幕上
对于我的应用程序,我想使用所有内置的操作可能性,例如缩放。但是,如果用户在屏幕上按 3 个手指,我想显示一个特定的 UI 元素。那么检查用户是否同时按下 3 个手指并在屏幕上彼此相邻的最佳方法是什么? (不禁用内置的操作可能性)。
我的第一个方法是在布局的顶部网格元素上注册 TouchDown 事件。在事件处理程序中我得到了联系方式。但在那里做什么呢?
只需检查联系人是否是指纹,将其存储在列表中,然后检查该列表是否已包含两个相似的联系人?
或者有更性感的解决方案吗?
谢谢!
编辑:
按照答案,我写了两种方法:
private void OnContactDown(object sender, ContactEventArgs e)
{
if (this.ContactsOver.Count == 3)
{
Console.WriteLine("3 contacts down. Check proximity");
if (areNear(this.ContactsOver))
{
Console.WriteLine("3 fingers down!");
}
}
}
private Boolean areNear(ReadOnlyContactCollection contacts)
{
if ( Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(1).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(1).GetCenterPosition(this).Y) < 100 &&
Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100)
{
return true;
}
else
{
return false;
}
}
它们必须重写,但它有效。并且必须调整阈值(atm 100)。
For my application I'd like to use all the built in manipulation possibilities, like e.g. zoom. But if the user presses 3 fingers on the screen I'd like to show a specific UI element. So what is the best way to check if the user has pressed 3 fingers at the same time and next to each other on the screen? (without disabling the built-in manipulation possibilties).
My first approach was to register the TouchDown event on the top Grid element of my layout. In the event handler I get the contact. But what to do there?
Just check if the contact is a fingerprint, store it in a List, and check if the list already contains two similar conacts?
Or is there a more sexy solution?
Thanks!
Edit:
Following the answer i wrote two methods:
private void OnContactDown(object sender, ContactEventArgs e)
{
if (this.ContactsOver.Count == 3)
{
Console.WriteLine("3 contacts down. Check proximity");
if (areNear(this.ContactsOver))
{
Console.WriteLine("3 fingers down!");
}
}
}
private Boolean areNear(ReadOnlyContactCollection contacts)
{
if ( Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(1).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(1).GetCenterPosition(this).Y) < 100 &&
Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100)
{
return true;
}
else
{
return false;
}
}
They have to be rewritten, but it works. And the threshold (atm 100) has to be adjusted.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
所有表面控件上都有一个属性,其中包含其上的触点数量。该属性是 ContactsOver 或其任何变体,具体取决于您的需要,请参阅 http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx
您例如,可以在 ContactDown 事件处理程序中检查该属性的 Count 值。要检查它们的距离,只需对它们执行 GetPosition 并对这些点使用基本向量数学即可。
There is a property on all surface controls that contains the number of contacts över it. The propery is ContactsOver or any variant of it depending on your need, see http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx
You could check that propery's Count value in your ContactDown event handler for instance. To check their distance, just do a GetPosition on them and use basic vector math on the points.