internal void HandleTouch(TouchEffect sender, TouchStatus status) { if (sender.IsDisabled) { return; } var canExecuteAction = sender.CanExecute; if (status != TouchStatus.Started || canExecuteAction) { if (!canExecuteAction) { status = TouchStatus.Canceled; } var state = status == TouchStatus.Started ? TouchState.Pressed : TouchState.Normal; if (status == TouchStatus.Started) { animationProgress = 0; animationState = state; } var isToggled = sender.IsToggled; if (isToggled.HasValue) { if (status != TouchStatus.Started) { durationMultiplier = (animationState == TouchState.Pressed && !isToggled.Value) || (animationState == TouchState.Normal && isToggled.Value) ? 1 - animationProgress : animationProgress; UpdateStatusAndState(sender, status, state); if (status == TouchStatus.Canceled) { sender.ForceUpdateState(false); return; } OnTapped(sender); sender.IsToggled = !isToggled; return; } state = isToggled.Value ? TouchState.Normal : TouchState.Pressed; } UpdateStatusAndState(sender, status, state); } if (status == TouchStatus.Completed) { OnTapped(sender); } }