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);
        }
示例#3
0
 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);
     }
 }
示例#4
0
        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();
                }
            });
        }
示例#5
0
        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();
                }
            });
        }