www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Blog Einfache Touch-Gesten mit WinRT erkennen




















































Einfache Touch-Gesten mit WinRT erkennen
Sonntag, den 18. November 2012 um 17:46 Uhr

Wieder etwas Zeit und die Entwicklung am ersten eigenen WinRT-Game geht weiter. Etwas an der Grafik herumgebastelt und auch versucht, eine Touch-Bedienung umzusetzen. Bezüglich der Touch-Bedienung muss ich Microsoft loben, diese umzusetzen hat lediglich 10 Minuten gedauert. Im Prinzip ist die Geste auch nicht schwer, ich benötige eine Wisch-Geste nach Links, Rechts, Oben und Unten. Folgender Code reicht, um genau diese Gesten für ein beliebiges UIElement zu erkennen.

 

  1. //Some very simple gesture events
  2. public event EventHandler MoveLeft;
  3. public event EventHandler MoveTop;
  4. public event EventHandler MoveRight;
  5. public event EventHandler MoveDown;
  6.  
  7. /// <summary>
  8. /// Initializes a new instance of the <see cref="UIGestureCatcher" /> class.
  9. /// </summary>
  10. public UIGestureCatcher(UIElement uiElement)
  11. {
  12. //Configure manipulation events an register on update event
  13. uiElement.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY;
  14. uiElement.ManipulationDelta += OnUIElementManipulationDelta;
  15. }
  16.  
  17. private void OnUIElementManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs args)
  18. {
  19.  
  20. if ((Math.Abs(args.Cumulative.Translation.X) > 100.0) ||
  21. (Math.Abs(args.Cumulative.Translation.Y) > 100.0))
  22. {
  23. //Handle the case when one coordinat is zero
  24. if (args.Cumulative.Translation.X == 0f)
  25. {
  26. if (args.Cumulative.Translation.Y < 0f) { MoveTop.Raise(this, EventArgs.Empty); }
  27. else { MoveDown.Raise(this, EventArgs.Empty); }
  28.  
  29. args.Complete();
  30. return;
  31. }
  32. else if (args.Cumulative.Translation.Y == 0f)
  33. {
  34. if (args.Cumulative.Translation.X < 0f) { MoveLeft.Raise(this, EventArgs.Empty); }
  35. else { MoveRight.Raise(this, EventArgs.Empty); }
  36.  
  37. args.Complete();
  38. return;
  39. }
  40.  
  41. //Handling logic for standard case
  42. float xToY = (float)args.Cumulative.Translation.X / (float)args.Cumulative.Translation.Y;
  43. float yToX = (float)args.Cumulative.Translation.Y / (float)args.Cumulative.Translation.X;
  44. if (Math.Abs(xToY) < 0.4f)
  45. {
  46. if (args.Cumulative.Translation.Y < 0f) { MoveTop.Raise(this, EventArgs.Empty); }
  47. else { MoveDown.Raise(this, EventArgs.Empty); }
  48.  
  49. args.Complete();
  50. return;
  51. }
  52. else if (Math.Abs(yToX) < 0.4f)
  53. {
  54. if (args.Cumulative.Translation.X < 0f) { MoveLeft.Raise(this, EventArgs.Empty); }
  55. else { MoveRight.Raise(this, EventArgs.Empty); }
  56.  
  57. args.Complete();
  58. return;
  59. }
  60. }
  61. }

Die Ereignisse zu Beginn werden ausgelöst, sobald eine Geste erkannt wird. Um die Geste zu erkennen, verwende ich das ManipulationDelta Ereignis, welches von jedem UIElement zur Verfügung gestellt wird. Wichtig ist bloß wie oben die Eigenschaft ManipulationMode richtig zu setzen (standardmäßig auf None). Das Ereignis wird während der Touch-Bewegung für jeden auch noch so kleine Bewegung aufgerufen. In der Methode prüfe ich auf das Verhältnis zwischen X- und Y-Verschiebung sobald die Bewegung insgesamt mindestens 100 Pixel in eine beliebige Richtung beträgt. Anhand dieser Logik kann man relativ leicht Links, Rechts, Oben und Unten auseinander halten. Wichtig ist jeweils am Ende die Complete Methode aufzurufen, damit dasselbe Ereignis für die aktuelle Geste nicht noch weiter aufgerufen wird.

 

So ganz nebenbei, der aktuelle Stand des Snake-Klons sieht folgendermaßen aus:

 

 

 

Kommentar hinzufügen

Ihr Name:
Kommentar: