protected override Paint GetPaintInner(Windows.Foundation.Rect destinationRect) { var paint = new Paint(); // Android LinearGradient requires two ore more stop points. if (GradientStops.Count >= 2) { var colors = GradientStops.Select(s => ((Android.Graphics.Color)s.Color).ToArgb()).ToArray(); var locations = GradientStops.Select(s => (float)s.Offset).ToArray(); var width = destinationRect.Width; var height = destinationRect.Height; var transform = RelativeTransform?.ToNativeTransform(size: new Windows.Foundation.Size(width, height), isBrush: true); //Matrix .MapPoints takes an array of floats var pts = new[] { StartPoint, EndPoint } .Select(p => new float[] { (float)(p.X * width), (float)(p.Y * height) }) .SelectMany(p => p) .ToArray(); transform?.MapPoints(pts); var shader = new LinearGradient(pts[0], pts[1], pts[2], pts[3], colors, locations, Shader.TileMode.Mirror); paint.SetShader(shader); } return(paint); }
internal CAGradientLayer GetLayer(CGSize size) { var gradientLayer = new CAGradientLayer(); gradientLayer.Colors = GradientStops.Select(gs => (CGColor)gs.Color).ToArray(); gradientLayer.Locations = GradientStops.Select(gs => new NSNumber(gs.Offset)).ToArray(); var transform = RelativeTransform?.ToNativeTransform(size); gradientLayer.StartPoint = transform?.TransformPoint(StartPoint) ?? StartPoint; gradientLayer.EndPoint = transform?.TransformPoint(EndPoint) ?? EndPoint; return(gradientLayer); }
/// <summary> /// Create matrix to transform image based on relative dimensions of bitmap and drawRect, Stretch mode, and RelativeTransform /// </summary> /// <param name="drawRect"></param> /// <param name="bitmap"></param> /// <returns></returns> private Android.Graphics.Matrix GenerateMatrix(Foundation.Rect drawRect, Bitmap bitmap) { var matrix = new Android.Graphics.Matrix(); // Note that bitmap.Width and bitmap.Height (in physical pixels) are automatically scaled up when loaded from local resources, but aren't when acquired externally. // This means that bitmaps acquired externally might not render the same way on devices with different densities when using Stretch.None. var sourceRect = new Foundation.Rect(0, 0, bitmap.Width, bitmap.Height); var destinationRect = GetArrangedImageRect(sourceRect.Size, drawRect); matrix.SetRectToRect(sourceRect.ToRectF(), destinationRect.ToRectF(), Android.Graphics.Matrix.ScaleToFit.Fill); RelativeTransform?.ToNativeTransform(matrix, new Size(drawRect.Width, drawRect.Height), isBrush: true); return(matrix); }
internal CAGradientLayer GetLayer(CGSize size) { var gradientLayer = new CAGradientLayer(); gradientLayer.Colors = GradientStops.Select(gs => (CGColor)gs.Color).ToArray(); gradientLayer.Locations = GradientStops.Select(gs => new NSNumber(gs.Offset)).ToArray(); var transform = RelativeTransform?.ToNativeTransform(size); #if __IOS__ gradientLayer.StartPoint = transform?.TransformPoint(StartPoint) ?? StartPoint; gradientLayer.EndPoint = transform?.TransformPoint(EndPoint) ?? EndPoint; return(gradientLayer); #elif __MACOS__ throw new NotImplementedException(); #endif }