2016-09-12 4 views
1

Я делаю некоторые тесты с помощью распознавателя жесты. Настройка довольно проста: у меня есть окно размером 20x20 и устанавливается относительным расположением. Обработчик сковороду жестXamarin pan gesture распознаватель не дает точных координат

switch (args.StatusType) 
      { 
       case GestureStatus.Running: 
        box.TranslationX = box.X + args.TotalX; 
        box.TranslationY = box.Y + args.TotalY; 
        break; 
       case GestureStatus.Completed: 
        box.TranslationX = 0; 
        box.TranslationY = 0; 
        break; 
      } 

Так он работает нормально, но когда я пытаюсь перетащить boxview вокруг экрана, он не переводит значения правильно. Он также дает этот действительно неприятный проблесковый эффект, когда он пытается перерисовать окно. Есть ли лучший способ сделать это? Есть ли способ избавиться от мигания?

+0

какой макет вы используете? – nicks

+0

Он находится в относительном расположении. – Arthurdent510

+0

Я реализовал пример, предоставленный Xamarin ([Добавление признака распознавания жесткого диска] (https://developer.xamarin.com/guides/xamarin-forms/user-interface/gestures/pan/)), и такое же поведение происходит , Элемент, который я пытаюсь переместить, мигает во время жестов (на самом деле он очень быстро переключается из одной позиции в другую, что вызывает этот «проблесковый» эффект). –

ответ

1

Я нашел реализацию на форумах Xamarin, которая поможет вам решить вашу проблему (Pinch and Pan gesture recognizers not working on Android project). Вот реализация Пан, я проверил это с моим проектом, и заметил, что «мигающий» эффект не больше присутствует:

private double startScale, currentScale, xOffset, yOffset, startX, startY; 
... 
public void OnPanUpdated(object sender, PanUpdatedEventArgs e) 
{ 
    switch (e.StatusType) 
    { 
     case GestureStatus.Started: 
      startX = e.TotalX; 
      startY = e.TotalY; 
      Content.AnchorX = 0; 
      Content.AnchorY = 0; 
      break; 

     case GestureStatus.Running: 
      var maxTranslationX = Content.Scale * Content.Width - Content.Width; 
      Content.TranslationX = Math.Min(0, Math.Max(-maxTranslationX, xOffset + e.TotalX - startX)); 

      var maxTranslationY = Content.Scale * Content.Height - Content.Height; 
      Content.TranslationY = Math.Min(0, Math.Max(-maxTranslationY, yOffset + e.TotalY - startY)); 
      break; 

     case GestureStatus.Completed: 
      xOffset = Content.TranslationX; 
      yOffset = Content.TranslationY; 
      break; 
    } 
} 

Позвольте мне знать, если это помогает.

+0

Спасибо за ответ! Я работаю над этим сейчас, однако maxTranslation всегда возвращается как 0. Похоже, что это должно быть что-то вроде var maxTranslationX = Content.Scale * Screen.Width - Content.Width? Где вы используете ширину экрана, а не ширину содержимого? Или я не ошибаюсь? – Arthurdent510

Смежные вопросы