PointerContactsTab.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using Avalonia;
  6. using Avalonia.Controls;
  7. using Avalonia.Input;
  8. using Avalonia.Media;
  9. using Avalonia.Media.Immutable;
  10. namespace ControlCatalog.Pages;
  11. public class PointerContactsTab : Control
  12. {
  13. class PointerInfo
  14. {
  15. public Point Point { get; set; }
  16. public Color Color { get; set; }
  17. }
  18. private static Color[] AllColors = new[]
  19. {
  20. Colors.Aqua,
  21. Colors.Beige,
  22. Colors.Chartreuse,
  23. Colors.Coral,
  24. Colors.Fuchsia,
  25. Colors.Crimson,
  26. Colors.Lavender,
  27. Colors.Orange,
  28. Colors.Orchid,
  29. Colors.ForestGreen,
  30. Colors.SteelBlue,
  31. Colors.PapayaWhip,
  32. Colors.PaleVioletRed,
  33. Colors.Goldenrod,
  34. Colors.Maroon,
  35. Colors.Moccasin,
  36. Colors.Navy,
  37. Colors.Wheat,
  38. Colors.Violet,
  39. Colors.Sienna,
  40. Colors.Indigo,
  41. Colors.Honeydew
  42. };
  43. private Dictionary<IPointer, PointerInfo> _pointers = new Dictionary<IPointer, PointerInfo>();
  44. public PointerContactsTab()
  45. {
  46. ClipToBounds = true;
  47. }
  48. void UpdatePointer(PointerEventArgs e)
  49. {
  50. if (!_pointers.TryGetValue(e.Pointer, out var info))
  51. {
  52. if (e.RoutedEvent == PointerMovedEvent)
  53. return;
  54. var colors = AllColors.Except(_pointers.Values.Select(c => c.Color)).ToArray();
  55. var color = colors[new Random().Next(0, colors.Length - 1)];
  56. _pointers[e.Pointer] = info = new PointerInfo { Color = color };
  57. }
  58. info.Point = e.GetPosition(this);
  59. InvalidateVisual();
  60. }
  61. protected override void OnPointerPressed(PointerPressedEventArgs e)
  62. {
  63. UpdatePointer(e);
  64. e.Pointer.Capture(this);
  65. e.Handled = true;
  66. base.OnPointerPressed(e);
  67. }
  68. protected override void OnPointerMoved(PointerEventArgs e)
  69. {
  70. UpdatePointer(e);
  71. e.Handled = true;
  72. base.OnPointerMoved(e);
  73. }
  74. protected override void OnPointerReleased(PointerReleasedEventArgs e)
  75. {
  76. _pointers.Remove(e.Pointer);
  77. e.Handled = true;
  78. InvalidateVisual();
  79. }
  80. protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e)
  81. {
  82. _pointers.Remove(e.Pointer);
  83. InvalidateVisual();
  84. }
  85. public override void Render(DrawingContext context)
  86. {
  87. context.FillRectangle(Brushes.Transparent, new Rect(default, Bounds.Size));
  88. foreach (var pt in _pointers.Values)
  89. {
  90. var brush = new ImmutableSolidColorBrush(pt.Color);
  91. context.DrawEllipse(brush, null, pt.Point, 75, 75);
  92. }
  93. }
  94. }