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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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
        }