In **.NET MAUI**, there is **NO built-in `PressGestureRecognizer`** (unlike some Xamarin plugins). So we must **implement long-press manually** using a **Timer + Touch events**.
Let me show you the **correct MAUI-native solution** for:
> ✅ Long press to enable drag
> ✅ Normal tap to open menu
> ✅ Smooth dragging
---
# ✅ Correct Long-Press Implementation in .NET MAUI
We’ll use:
* `PanGestureRecognizer` → movement
* `TapGestureRecognizer` → click
* `DispatcherTimer` → long-press detection
---
# 🧱 Updated Working Gesture Logic
### Add these fields:
```csharp
bool isDragging;
bool isMenuOpen;
bool isLongPressTriggered;
DispatcherTimer longPressTimer;
const int LongPressDuration = 350; // milliseconds
```
---
# 🧠 Setup Gestures Correctly
```csharp
void SetupGestures()
{
longPressTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(LongPressDuration)
};
longPressTimer.Tick += (s, e) =>
{
longPressTimer.Stop();
isLongPressTriggered = true;
StartDrag();
};
var pan = new PanGestureRecognizer();
pan.PanUpdated += Pan_PanUpdated;
FloatingContainer.GestureRecognizers.Add(pan);
var tap = new TapGestureRecognizer();
tap.Tapped += MainIcon_Tapped;
FloatingContainer.GestureRecognizers.Add(tap);
var outsideTap = new TapGestureRecognizer();
outsideTap.Tapped += (s, e) => StopDrag();
Overlay.GestureRecognizers.Add(outsideTap);
var closeTap = new TapGestureRecognizer();
closeTap.Tapped += (s, e) => StopDrag();
CloseIcon.GestureRecognizers.Add(closeTap);
FloatingContainer.Touch += FloatingContainer_Touch;
}
```
---
# 🖐️ Long Press Detection (REAL MAUI Way)
```csharp
private void FloatingContainer_Touch(object sender, TouchEventArgs e)
{
if (e.Type == TouchEventType.Pressed)
{
isLongPressTriggered = false;
longPressTimer.Start();
}
else if (e.Type == TouchEventType.Released)
{
longPressTimer.Stop();
}
}
```
> ⚠️ Touch events require **CommunityToolkit.Maui**
---
# 📦 Enable Touch Events (IMPORTANT)
Install toolkit:
```bash
dotnet add package CommunityToolkit.Maui
```
In `MauiProgram.cs`:
```csharp
builder.UseMauiCommunityToolkit();
```
---
# 🧠 Pan Gesture (drag only after long press)
```csharp
void Pan_PanUpdated(object sender, PanUpdatedEventArgs e)
{
if (!isDragging) return;
if (e.StatusType == GestureStatus.Running)
{
FloatingContainer.TranslationX += e.DeltaX;
FloatingContainer.TranslationY += e.DeltaY;
}
}
```
---
# 🧠 Tap Logic (short tap → menu)
```csharp
void MainIcon_Tapped(object sender, EventArgs e)
{
if (isLongPressTriggered) return;
ToggleMenu();
}
```
---
# 🎯 Result Behavior
| Action | Result |
| ------------------ | ------------------- |
| Short tap | Opens menu |
| Long press (350ms) | Enables drag |
| Drag | Moves floating icon |
| Tap ❌ | Stops drag |
| Tap outside | Stops drag |
---
# 🔥 Want PRO-Level Floating UI?
I can provide:
* Physics snap-to-edge
* Auto docking
* Smooth spring animations
* True Android floating overlay (above all apps)
If you want **production-grade floating UI**, say *yes* 😄
No comments:
Post a Comment