Как проверить, находятся ли 3 пальца на экране - PullRequest
5 голосов
/ 13 ноября 2010

Для моего приложения я хотел бы использовать все встроенные возможности манипуляции, такие как, например, масштабирование.Но если пользователь нажимает 3 пальца на экране, я хотел бы показать определенный элемент пользовательского интерфейса.Итак, как лучше всего проверить, нажал ли пользователь 3 пальца одновременно и рядом друг с другом на экране?(без отключения встроенных возможностей манипуляции).

Мой первый подход состоял в том, чтобы зарегистрировать событие TouchDown в верхнем элементе Grid моего макета.В обработчике событий я получаю контакт.Но что там делать?

Просто проверьте, является ли контакт отпечатком пальца, сохраните его в списке и убедитесь, что в списке уже есть два похожих контакта?

Или есть более сексуальныйрешение?

Спасибо!

Редактировать:

После ответа я написал два метода:

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;
            }
        }

Они должны быть переписаны, но это работает,И порог (атм 100) должен быть отрегулирован.

1 Ответ

2 голосов
/ 14 ноября 2010

На всех элементах управления на поверхности есть свойство, которое содержит количество контактов. Свойство ContactsOver или любой другой вариант в зависимости от ваших потребностей, см. http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx

Например, вы можете проверить значение Count этого свойства в вашем обработчике событий ContactDown. Чтобы проверить их расстояние, просто сделайте GetPosition на них и используйте базовую векторную математику на точках.

...