точная проверка строки (WPF Multitouch)
-
19-09-2019 - |
Вопрос
Во-первых, я пытаюсь представить вам картину, я пытаюсь реализовать жест в WPF4 VS2010, это похоже на то, как будто вы перемещаете палец до тех пор, пока он не пересечет TouchPoint, мимо которого вы уже прошли ТЕМ ЖЕ пальцем, поэтому я думаю: чтобы составить список и проверить наличие каждой новой TouchPoint, если она существует. Если да, то вы сделали свой жест, если нет, то добавьте TouchPoint в коллекцию для сравнения со следующими TouchPoints.по какой-то причине это не работает, поэтому я перешел к другому подходу, заменив TouchPoints на X, Y для TouchPoint, преобразовав их в строки и попытавшись использовать против них метод contains, используя события TouchMove и TouchUp, мой код выглядит так:
private void g1_TouchMove(object sender, TouchEventArgs e)
{
if(touchX.Contains(""+e.GetTouchPoint(g1).Position.X) && touchY.Contains(""+e.GetTouchPoint(g1).Position.Y))
{
// Clearing the lists , changing the canvas background color to know that the gesture is done
touchX.Clear();
touchY.Clear();
g1.Background = Brushes.AliceBlue;
}
else
{
//adding new X, Y values to their respective lists
touchX.Add(""+e.GetTouchPoint(g1).Position.X);
touchY.Add( ""+e.GetTouchPoint(g1).Position.Y);
}
}
private void g1_TouchUp(object sender, TouchEventArgs e)
{
//clearing the lists after the touch is up (finger removed)
touchX.Clear();
touchY.Clear();
//getting the canvas it's original background color
g1.Background = Brushes.Orange;
}
Итак, при тестировании это не сработало, даже если я перемещаю касание по прямой линии, фон меняется.Любые идеи ?
заранее спасибо
Решение
Прежде всего, вернитесь к использованию цифр.Помещать числа в строки для последующего сравнения неправильно на многих уровнях :-)
Я предполагаю, что ваша проблема связана с проблемой разрешения. Это практически невозможно ударить то же самое место как и раньше, поскольку есть много пикселей на экране.По сути, отклонение в один пиксель сделает ваш алгоритм бесполезным.Вместо этого вам следует сопоставить область касания с несколькими более крупными кластерами и проверить, было ли прикосновение в этом кластере раньше (а не в одном и том же пикселе).
Простой подход заключается в простом целочисленном делении полученных координат.
В приведенном ниже примере я делю систему координат пикселей на кластеры 3 на 3 пикселя, но вы можете использовать и больший размер, если это имеет для вас смысл.Все зависит от того, насколько велико разрешение сенсорной области.
На практике это означает, что любой пиксель в пределах этой области 3 на 3 считается равным.Итак, удар по (1,1)
соответствует предыдущему обращению на (2,3)
и так далее.
// Divide into 3x3 pixel clusters
var currentCluster = new Point((int)touchPos.X / 3, (int)touchPos.Y / 3)
// previousClusters is a List<Point>() which is cleared on TouchUp
foreach (var cluster in previousClusters)
{
if (cluster == currentCluster)
{
// We've been here before, do your magic here!
g1.Background = Brushes.AliceBlue;
// Return here, since we don't want to add the point again
return;
}
}
previousClusters.Add(currentCluster);