Skip to content

Commit 5786bde

Browse files
committed
支持长按左键倍速播放
1 parent 6495406 commit 5786bde

File tree

3 files changed

+55
-19
lines changed

3 files changed

+55
-19
lines changed

src/Desktop/BiliCopilot.UI/Controls/Core/Player/BiliPlayer.Create.cs

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public sealed partial class BiliPlayer
3535
private StackPanel _notificationContainer;
3636
private LoadingWidget _loadingWidget;
3737
private EmptyHolder _failedHolder;
38+
private GestureRecognizer _gestureRecognizer;
3839

3940
/// <summary>
4041
/// 注入弹幕控件创建函数.
@@ -57,6 +58,10 @@ public void InjectSubtitleControlFunc(Func<SubtitlePresenter> createSubtitleCont
5758
private void CreateOverlayContainer()
5859
{
5960
var rootGrid = new CursorGrid();
61+
_gestureRecognizer = new GestureRecognizer
62+
{
63+
GestureSettings = GestureSettings.HoldWithMouse | GestureSettings.Hold,
64+
};
6065

6166
if (!ViewModel.IsExternalPlayer)
6267
{

src/Desktop/BiliCopilot.UI/Controls/Core/Player/BiliPlayer.Methods.cs

+21-2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ private void RestoreCursor()
139139
}
140140
}
141141

142+
private void OnInteractionControlContextRequested(UIElement sender, ContextRequestedEventArgs args)
143+
{
144+
if (_isHolding)
145+
{
146+
args.Handled = true;
147+
sender.ContextFlyout?.Hide();
148+
}
149+
}
150+
142151
private void OnInteractionControlManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
143152
{
144153
_manipulationVolume = 0;
@@ -224,10 +233,14 @@ private void OnInteractionControlManipulationStarted(object sender, Manipulation
224233
}
225234

226235
private void OnRootPointerCanceled(object sender, PointerRoutedEventArgs e)
227-
=> HandlePointerEvent(e, true);
236+
{
237+
_gestureRecognizer.ProcessUpEvent(e.GetCurrentPoint((UIElement)sender));
238+
HandlePointerEvent(e, true);
239+
}
228240

229241
private void OnRootPointerPressed(object sender, PointerRoutedEventArgs e)
230242
{
243+
_gestureRecognizer.ProcessDownEvent(e.GetCurrentPoint((UIElement)sender));
231244
if (ViewModel is IslandPlayerViewModel)
232245
{
233246
var point = e.GetCurrentPoint((UIElement)sender);
@@ -264,5 +277,11 @@ private void OnRootPointerEntered(object sender, PointerRoutedEventArgs e)
264277
=> HandlePointerEvent(e);
265278

266279
private void OnRootPointerMoved(object sender, PointerRoutedEventArgs e)
267-
=> HandlePointerEvent(e);
280+
{
281+
_gestureRecognizer.ProcessMoveEvents(e.GetIntermediatePoints((UIElement)sender));
282+
HandlePointerEvent(e);
283+
}
284+
285+
private void OnRootPointerReleased(object sender, PointerRoutedEventArgs e)
286+
=> _gestureRecognizer.ProcessUpEvent(e.GetCurrentPoint((UIElement)sender));
268287
}

src/Desktop/BiliCopilot.UI/Controls/Core/Player/BiliPlayer.cs

+29-17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed partial class BiliPlayer : PlayerControlBase
1818
private Rect _transportControlTriggerRect;
1919
private DispatcherTimer? _cursorTimer;
2020

21+
private bool _isHolding;
2122
private double _lastSpeed;
2223
private double _cursorStayTime;
2324
private double _mtcStayTime;
@@ -127,6 +128,23 @@ private void HookRootPointerEvents()
127128
_overlayContainer.PointerExited += OnRootPointerExited;
128129
_overlayContainer.PointerPressed += OnRootPointerPressed;
129130
_overlayContainer.PointerCanceled += OnRootPointerCanceled;
131+
_overlayContainer.PointerReleased += OnRootPointerReleased;
132+
}
133+
134+
private void OnGestureRecognizerHolding(GestureRecognizer sender, HoldingEventArgs args)
135+
{
136+
_isHolding = true;
137+
if (args.HoldingState == HoldingState.Started)
138+
{
139+
_lastSpeed = ViewModel.Speed;
140+
ViewModel.SetSpeedCommand.Execute(3d);
141+
}
142+
else
143+
{
144+
_lastSpeed = _lastSpeed == 0 ? 1.0 : _lastSpeed;
145+
ViewModel.SetSpeedCommand.Execute(_lastSpeed);
146+
_lastSpeed = 0;
147+
}
130148
}
131149

132150
private void UnhookRootPointerEvents()
@@ -138,18 +156,20 @@ private void UnhookRootPointerEvents()
138156
_overlayContainer.PointerExited -= OnRootPointerExited;
139157
_overlayContainer.PointerPressed -= OnRootPointerPressed;
140158
_overlayContainer.PointerCanceled -= OnRootPointerCanceled;
159+
_overlayContainer.PointerReleased -= OnRootPointerReleased;
141160
}
142161
}
143162

144163
private void HookInteractionControlEvents()
145164
{
146165
_interactionControl.Tapped += OnCoreTapped;
147166
_interactionControl.DoubleTapped += OnCoreDoubleTapped;
148-
_interactionControl.Holding += OnCoreHolding;
149167
_interactionControl.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY;
150168
_interactionControl.ManipulationStarted += OnInteractionControlManipulationStarted;
151169
_interactionControl.ManipulationDelta += OnInteractionControlManipulationDelta;
152170
_interactionControl.ManipulationCompleted += OnInteractionControlManipulationCompleted;
171+
_interactionControl.ContextRequested += OnInteractionControlContextRequested;
172+
_gestureRecognizer.Holding += OnGestureRecognizerHolding;
153173
}
154174

155175
private void UnhookInteractionControlEvents()
@@ -158,10 +178,11 @@ private void UnhookInteractionControlEvents()
158178
{
159179
_interactionControl.Tapped -= OnCoreTapped;
160180
_interactionControl.DoubleTapped -= OnCoreDoubleTapped;
161-
_interactionControl.Holding -= OnCoreHolding;
162181
_interactionControl.ManipulationStarted -= OnInteractionControlManipulationStarted;
163182
_interactionControl.ManipulationDelta -= OnInteractionControlManipulationDelta;
164183
_interactionControl.ManipulationCompleted -= OnInteractionControlManipulationCompleted;
184+
_interactionControl.ContextRequested -= OnInteractionControlContextRequested;
185+
_gestureRecognizer.Holding -= OnGestureRecognizerHolding;
165186
}
166187
}
167188

@@ -237,6 +258,12 @@ private void OnViewModelInitialized(object? sender, EventArgs e)
237258

238259
private void OnCoreTapped(object sender, TappedRoutedEventArgs e)
239260
{
261+
if (_isHolding)
262+
{
263+
_isHolding = false;
264+
return;
265+
}
266+
240267
var isManual = SettingsToolkit.ReadLocalSetting(SettingNames.MTCBehavior, MTCBehavior.Automatic) == MTCBehavior.Manual;
241268
if (isManual)
242269
{
@@ -274,21 +301,6 @@ private void OnCoreDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
274301
}
275302
}
276303

277-
private void OnCoreHolding(object sender, HoldingRoutedEventArgs e)
278-
{
279-
if (e.HoldingState == HoldingState.Started)
280-
{
281-
_lastSpeed = ViewModel.Speed;
282-
ViewModel.SetSpeedCommand.Execute(3d);
283-
}
284-
else
285-
{
286-
_lastSpeed = _lastSpeed == 0 ? 1.0 : _lastSpeed;
287-
ViewModel.SetSpeedCommand.Execute(_lastSpeed);
288-
_lastSpeed = 0;
289-
}
290-
}
291-
292304
private void OnViewModelInnerPropertyChanged(object? sender, PropertyChangedEventArgs e)
293305
{
294306
if (_overlayContainer is not null)

0 commit comments

Comments
 (0)