Вопрос

Во-первых, я пытаюсь представить вам картину, я пытаюсь реализовать жест в 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top