/// <summary> /// Paint text /// </summary> private void OnPaintText(SKPaintSurfaceEventArgs e) { SKPaint textPaint = new SKPaint(); textPaint.Color = AnimationUtils.ColorTransform(_toggledAnimationProcess, TextColor, ToggledTextColor).ToSKColor(); textPaint.TextSize = (float)FontSize * DeviceScale; textPaint.TextAlign = SKTextAlign.Left; textPaint.IsAntialias = true; SKFontStyleSlant slant = SkiaUtils.ConvertToSKFontStyle(FontStyle); SKFontStyleWeight fontWeight = SkiaUtils.ConvertToSKFontWeight(FontWeight); textPaint.Typeface = SKTypeface.FromFamilyName(FontFamily, fontWeight, SKFontStyleWidth.Normal, slant); SKRect skTextBounds = new SKRect(); textPaint.MeasureText(Text, ref skTextBounds); float skNegativePadding = (float)EllipseDiameter * DeviceScale; float xText = skNegativePadding - skTextBounds.Left + (float)(TextMargin.Left * DeviceScale); float yText = -skTextBounds.Top + (e.Info.Height - skTextBounds.Height) / 2; double checkBoxWidth = _selectionViewSize.Width; if (_selectionViewLocation == HorizontalLocations.Left) { xText += (float)(checkBoxWidth * DeviceScale); } float lineHeight = (float)FontSize * DeviceScale; float skAvailableWidth = (float)(Width - checkBoxWidth - TextMargin.HorizontalThickness) * DeviceScale; SkiaUtils.DrawTextArea(e.Surface.Canvas, textPaint, xText, yText, skAvailableWidth, lineHeight, IsTextWrapping, Text); }
/// <summary> /// Measure total size /// </summary> protected Size MeasureTextSize(double widthConstraint, double heightConstraint) { SKPaint paint = new SKPaint(); paint.TextSize = (float)FontSize; SKFontStyleSlant slant = SkiaUtils.ConvertToSKFontStyle(FontStyle); SKFontStyleWeight fontWeight = SkiaUtils.ConvertToSKFontWeight(FontWeight); paint.Typeface = SKTypeface.FromFamilyName(FontFamily, fontWeight, SKFontStyleWidth.Normal, slant); float lineHeight = (float)FontSize; return(SkiaUtils.MeasureText(paint, (float)widthConstraint, lineHeight, IsTextWrapping, Text)); }
/// <summary> /// Paint swich /// </summary> protected override void OnPaintSelectionElement(SKPaintSurfaceEventArgs e) { float skTrackCornerRadius = (float)(_visualSettings.TrackCornerRadius * DeviceScale); float skTrackBorderThickness = (float)(_visualSettings.TrackBorderThickness * DeviceScale); float skActualTrackHeight = (float)(_visualSettings.TrackHeightRequest * DeviceScale); float skActualTrackWidth = (float)(_visualSettings.TrackWidthRequest * DeviceScale); float skThumbCornerRadius = (float)(_visualSettings.ThumbCornerRadius * DeviceScale); float skThumbBorderThickness = (float)(_visualSettings.ThumbBorderThickness * DeviceScale); float skActualThumbHeight = (float)(_visualSettings.ThumbHeightRequest * DeviceScale); float skActualThumbWidth = (float)(_visualSettings.ThumbWidthRequest * DeviceScale); float skHorizontalTextMargin = string.IsNullOrEmpty(Text) == false ? (float)(TextMargin.HorizontalThickness * DeviceScale) : 0; float skNegativePadding = (float)NegativePadding * DeviceScale; float skWidth = (float)e.Info.Width; float skHeight = (float)e.Info.Height; // // Track location // float skActualTrackCornerRadius = Math.Min(skTrackCornerRadius, Math.Min(skActualTrackHeight, skActualTrackWidth)); float skStartX = 0; if (SwitchLocation == HorizontalLocations.Right) { if (HorizontalOptions.Alignment == LayoutAlignment.Fill) { skStartX = skWidth - skNegativePadding - skActualTrackWidth - (float)((Padding.Right + _visualSettings.ThumbHorizontalNegativeRightPadding) * DeviceScale); } else { skStartX = (float)((_textSize.Width + _visualSettings.ThumbHorizontalNegativeLeftPadding) * DeviceScale) + skHorizontalTextMargin; } } else { skStartX = skNegativePadding + (float)(Padding.Right + _visualSettings.ThumbHorizontalNegativeRightPadding) * DeviceScale; } SKRect trackLocation = new SKRect(); trackLocation.Left = skStartX; trackLocation.Top = (skHeight - skActualTrackHeight) / 2; trackLocation.Right = trackLocation.Left + skActualTrackWidth; trackLocation.Bottom = trackLocation.Top + skActualTrackHeight; float skActualThumbCornerRadius = Math.Min(skThumbCornerRadius, Math.Min(skActualThumbHeight / 2, skActualThumbWidth / 2)); // // Thumb location // SKRect thumbLocation = new SKRect(); thumbLocation.Left = trackLocation.Left + (float)(_visualSettings.ThumbPadding.Left * DeviceScale) + (float)_toggledAnimationProcess * (skActualTrackWidth - skActualThumbWidth - (float)(_visualSettings.ThumbPadding.HorizontalThickness * DeviceScale)); thumbLocation.Top = (skHeight - skActualThumbHeight + (float)(_visualSettings.ThumbPadding.VerticalThickness * DeviceScale)) / 2; thumbLocation.Right = thumbLocation.Left + skActualThumbWidth; thumbLocation.Bottom = thumbLocation.Top + skActualThumbHeight; // // Draw Thumb ellipse // if (EllipseDiameter > 0 && _toggledAnimationProcess > 0 && _toggledAnimationProcess < 1 && IsEllipseAnimationEnabled) { SKPaint ellipsePaint = new SKPaint() { IsAntialias = true, Style = SKPaintStyle.Fill, }; if (_toggledAnimationProcess <= 0.5) { ellipsePaint.Color = EllipseColor.MultiplyAlpha(_toggledAnimationProcessWithoutEasing * 2).ToSKColor(); } else { ellipsePaint.Color = EllipseColor.MultiplyAlpha(1 - (_toggledAnimationProcessWithoutEasing - 0.5) * 2).ToSKColor(); } e.Surface.Canvas.DrawCircle(new SKPoint(thumbLocation.MidX, thumbLocation.MidY), (float)(EllipseDiameter / 2) * DeviceScale, ellipsePaint); } // // Draw track // SKPaint trackPaint = new SKPaint() { IsAntialias = true, Style = SKPaintStyle.Fill, Color = AnimationUtils.ColorTransform(_toggledAnimationProcess, TrackUnToggledColor, TrackToggledColor).ToSKColor(), }; e.Surface.Canvas.DrawRoundRect(trackLocation, skActualTrackCornerRadius, skActualTrackCornerRadius, trackPaint); // // Draw track border // if (skTrackBorderThickness > 0) { SKRect trackBorderLocation = new SKRect(); trackBorderLocation.Left = trackLocation.Left + skTrackBorderThickness / 2; trackBorderLocation.Top = trackLocation.Top + (skTrackBorderThickness / 2); trackBorderLocation.Right = trackLocation.Right - (skTrackBorderThickness / 2); trackBorderLocation.Bottom = trackLocation.Bottom - (skTrackBorderThickness / 2); SKPaint trackBorderPaint = new SKPaint() { IsAntialias = true, Style = SKPaintStyle.Stroke, Color = AnimationUtils.ColorTransform(_toggledAnimationProcess, TrackBorderUnToggledColor, TrackBorderToggledColor).ToSKColor(), StrokeWidth = skTrackBorderThickness, }; e.Surface.Canvas.DrawRoundRect(trackBorderLocation, skActualTrackCornerRadius, skActualTrackCornerRadius, trackBorderPaint); } // // Draw thumb shadow // if (IsThumbShadowEnabled) { SKRect shadowLocation = new SKRect(); shadowLocation.Left = thumbLocation.Left; shadowLocation.Right = thumbLocation.Right; shadowLocation.Top = thumbLocation.Top + _shadowLenght; shadowLocation.Bottom = thumbLocation.Bottom + _shadowLenght; SkiaUtils.DrawShadow(e, shadowLocation, skActualThumbCornerRadius, (float)(_shadowLenght * DeviceScale), Color.Black, 0.2, true); } // // Draw thumb // SKPaint thumbPaint = new SKPaint() { IsAntialias = true, Style = SKPaintStyle.Fill, Color = AnimationUtils.ColorTransform(_toggledAnimationProcess, ThumbUnToggledColor, ThumbToggledColor).ToSKColor(), }; SKRect thumbBackgroundLocation = thumbLocation; thumbBackgroundLocation.Inflate(-skThumbBorderThickness / 2, -skThumbBorderThickness / 2); e.Surface.Canvas.DrawRoundRect(thumbBackgroundLocation, skActualThumbCornerRadius, skActualThumbCornerRadius, thumbPaint); // // Draw thumb border // if (skThumbBorderThickness > 0) { SKRect thumbBorderLocation = new SKRect(); thumbBorderLocation.Left = thumbLocation.Left + (skThumbBorderThickness / 2); thumbBorderLocation.Top = thumbLocation.Top + (skThumbBorderThickness / 2); thumbBorderLocation.Right = thumbLocation.Right - (skThumbBorderThickness / 2); thumbBorderLocation.Bottom = thumbLocation.Bottom - (skThumbBorderThickness / 2); SKPaint thumbBorderPaint = new SKPaint() { IsAntialias = true, Style = SKPaintStyle.Stroke, Color = AnimationUtils.ColorTransform(_toggledAnimationProcess, ThumbBorderUnToggledColor, ThumbBorderToggledColor).ToSKColor(), StrokeWidth = skThumbBorderThickness, }; e.Surface.Canvas.DrawRoundRect(thumbBorderLocation, skActualThumbCornerRadius, skActualThumbCornerRadius, thumbBorderPaint); } }
/// <summary> /// Paint background, border and shadow /// </summary> private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e) { e.Surface.Canvas.Clear(); /* * if (ShadowLenght.Equals(0)) * { * return; * } */ // Get device pixel intencity scale DeviceScale = (float)(e.Info.Width / _skiaCanvas.Width); Rectangle contentLocationRelativeToCanvas = new Rectangle( ShadowLenght, ShadowLenght, Width - (ShadowLenght * 2), Height - (ShadowLenght * 2)); float maxCornerRadius = (float)Math.Min(Width / 2, Height / 2) * DeviceScale; float skCornerRadius = Math.Min(maxCornerRadius, (float)(CornerRadius * DeviceScale)); float skBorderThickness = (float)BorderThickness * DeviceScale; float skShadowLenght = (float)Math.Round(ShadowLenght * DeviceScale, MidpointRounding.AwayFromZero); SKRect skBackgroundDrawLocation = new SKRect(skShadowLenght, skShadowLenght, e.Info.Width - skShadowLenght, e.Info.Height - skShadowLenght); // Shadow if (ShadowLenght > 0 && ShadowColor != Color.Transparent && IsShadowEnabled) { SkiaUtils.DrawShadow(e, skBackgroundDrawLocation, skCornerRadius, skShadowLenght, ShadowColor, ShadowOpacity, false); } // Background if (BorderBackgroundColor != Color.Transparent) { if (_backgroundPaint == null) { _backgroundPaint = new SKPaint(); _backgroundPaint.IsAntialias = true; _backgroundPaint.Style = SKPaintStyle.Fill; _backgroundPaint.Color = BorderBackgroundColor.ToSKColor(); } SKRect backgroundRect = skBackgroundDrawLocation; if (BorderThickness > 0) { backgroundRect.Inflate(-skBorderThickness, -skBorderThickness); } SKRoundRect backgroundRoundedRect = new SKRoundRect(backgroundRect, skCornerRadius, skCornerRadius); e.Surface.Canvas.DrawRoundRect(backgroundRoundedRect, _backgroundPaint); } // Border if (BorderThickness > 0 && BorderColor != Color.Transparent) { if (_borderPaint == null) { _borderPaint = new SKPaint(); _borderPaint.Color = BorderColor.ToSKColor(); _borderPaint.IsAntialias = true; _borderPaint.Style = SKPaintStyle.Stroke; _borderPaint.StrokeWidth = skBorderThickness; } SKRect borderRect = skBackgroundDrawLocation; borderRect.Inflate(-skBorderThickness / 2, -skBorderThickness / 2); SKRoundRect borderRoundedRect = new SKRoundRect(borderRect, skCornerRadius, skCornerRadius); e.Surface.Canvas.DrawRoundRect(borderRoundedRect, _borderPaint); } }