PointerContactsTab.cs 2.8 KB

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