public override void MouseDown(NSEvent mouseEvent) { if (effect?.IsDisabled ?? true) { return; } effect?.HandleUserInteraction(TouchInteractionStatus.Started); effect?.HandleTouch(TouchStatus.Started); base.MouseDown(mouseEvent); }
void OnPointerCanceled(object sender, PointerRoutedEventArgs e) { if (effect?.IsDisabled ?? true) { return; } isPressed = false; effect?.HandleTouch(TouchStatus.Canceled); effect?.HandleUserInteraction(TouchInteractionStatus.Completed); effect?.HandleHover(HoverStatus.Exited); AnimateTilt(pointerUpStoryboard); }
void OnTouchDown(AView.TouchEventArgs e) { IsCanceled = false; startX = e.Event.GetX(); startY = e.Event.GetY(); effect?.HandleUserInteraction(TouchInteractionStatus.Started); effect?.HandleTouch(TouchStatus.Started); StartRipple(e.Event.GetX(), e.Event.GetY()); if (effect.DisallowTouchThreshold > 0) { Group.Parent?.RequestDisallowInterceptTouchEvent(true); } }
internal void HandleLongPress(TouchEffect sender) { if (sender.State == TouchState.Normal) { longPressTokenSource?.Cancel(); longPressTokenSource?.Dispose(); longPressTokenSource = null; return; } if (sender.LongPressCommand == null || sender.InteractionStatus == TouchInteractionStatus.Completed) { return; } longPressTokenSource = new CancellationTokenSource(); Task.Delay(sender.LongPressDuration, longPressTokenSource.Token).ContinueWith(t => { if (t.IsFaulted && t.Exception != null) { throw t.Exception; } if (t.IsCanceled) { return; } var longPressAction = new Action(() => { sender.HandleUserInteraction(TouchInteractionStatus.Completed); sender.RaiseLongPressCompleted(); }); if (Device.IsInvokeRequired) { Device.BeginInvokeOnMainThread(longPressAction); } else { longPressAction.Invoke(); } }); }
public void HandleTouch(TouchStatus status, TouchInteractionStatus?touchInteractionStatus = null) { if (IsCanceled || effect == null) { return; } if (effect?.IsDisabled ?? true) { return; } if (touchInteractionStatus == TouchInteractionStatus.Started) { effect?.HandleUserInteraction(TouchInteractionStatus.Started); touchInteractionStatus = null; } effect.HandleTouch(status); if (touchInteractionStatus.HasValue) { effect.HandleUserInteraction(touchInteractionStatus.Value); } if (!effect.NativeAnimation) { return; } if (longTapStarted && !tapCompleted) { return; } var control = effect.Element; if (!(Platform.GetOrCreateRenderer(control)?.NativeView is Widget nativeView)) { return; } if (status == TouchStatus.Started) { var startColor = nativeView.BackgroundColor; if (startColor.IsDefault) { return; } var endColor = effect.NativeAnimationColor.ToNative(); if (endColor.IsDefault) { startColor = EColor.FromRgba(startColor.R, startColor.G, startColor.B, startColor.A / 2); endColor = startColor; } var transit = new Transit { Repeat = 1, Duration = .2 }; var colorEffect = new ColorEffect(startColor, endColor); colorEffect.EffectEnded += (s, e) => { transit?.Dispose(); }; transit.Objects.Add(nativeView); transit.AddEffect(colorEffect); transit.Go(.2); } }
public async Task HandleTouch(TouchStatus status, TouchInteractionStatus?interactionStatus = null) { if (IsCanceled || effect == null) { return; } if (effect?.IsDisabled ?? true) { return; } var canExecuteAction = effect.CanExecute; if (interactionStatus == TouchInteractionStatus.Started) { effect?.HandleUserInteraction(TouchInteractionStatus.Started); interactionStatus = null; } effect?.HandleTouch(status); if (interactionStatus.HasValue) { effect?.HandleUserInteraction(interactionStatus.Value); } if (effect == null || (!effect.NativeAnimation && !IsButton) || (!canExecuteAction && status == TouchStatus.Started)) { return; } var control = effect.Element; if (control?.GetRenderer() is not UIView renderer) { return; } var color = effect.NativeAnimationColor; var radius = effect.NativeAnimationRadius; var shadowRadius = effect.NativeAnimationShadowRadius; var isStarted = status == TouchStatus.Started; defaultRadius = (float?)(defaultRadius ?? renderer.Layer.CornerRadius); defaultShadowRadius = (float?)(defaultShadowRadius ?? renderer.Layer.ShadowRadius); defaultShadowOpacity ??= renderer.Layer.ShadowOpacity; await UIView.AnimateAsync(.2, () => { if (color == Color.Default) { renderer.Layer.Opacity = isStarted ? 0.5f : (float)control.Opacity; } else { renderer.Layer.BackgroundColor = (isStarted ? color : control.BackgroundColor).ToCGColor(); } renderer.Layer.CornerRadius = isStarted ? radius : defaultRadius.GetValueOrDefault(); if (shadowRadius >= 0) { renderer.Layer.ShadowRadius = isStarted ? shadowRadius : defaultShadowRadius.GetValueOrDefault(); renderer.Layer.ShadowOpacity = isStarted ? 0.7f : defaultShadowOpacity.GetValueOrDefault(); } }); }