【问题标题】:Xamarin.Forms SkiaSharp Gradient working on Android but not on iOSXamarin.Forms SkiaSharp Gradient 适用于 Android 但不适用于 iOS
【发布时间】:2018-04-19 04:16:07
【问题描述】:

我们需要在页面上使用 Gradient,因此我们使用 SkiaSharp 和 GradientView。这在 Android 上运行良好,但在 iOS 上不起作用 - 只是不显示渐变。

我们是否需要在 iOS 上使用渲染器或 AppDelegate 中的代码对 SkiaSharp 进行任何特定于 iOS 的初始化?

编辑 这是在装有 iOS 10.3.3 的 iPad 上运行的。 我们的 XAML:

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="MyProject.XForms.Controls.GradientView">
    </ContentView>

我们的 XAML.cs

using SkiaSharp;
using SkiaSharp.Views.Forms;
using Xamarin.Forms;

namespace MyProject.XForms.Controls
{
    public partial class GradientView : ContentView
    {
        public Color StartColor { get; set; } = Color.Transparent;
        public Color EndColor { get; set; } = Color.Transparent;
        public bool Horizontal { get; set; } = false;

        public GradientView()
        {
            InitializeComponent();

            SKCanvasView canvasView = new SKCanvasView();
            canvasView.PaintSurface += OnCanvasViewPaintSurface;
            Content = canvasView;
        }

        void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
        {
            SKImageInfo info = args.Info;
            SKSurface surface = args.Surface;
            SKCanvas canvas = surface.Canvas;

            canvas.Clear();

            var colors = new SKColor[] { StartColor.ToSKColor(), EndColor.ToSKColor() };
            SKPoint startPoint = new SKPoint(0, 0);
            SKPoint endPoint = Horizontal ? new SKPoint(info.Width, 0) : new SKPoint(0, info.Height);

            var shader = SKShader.CreateLinearGradient(startPoint, endPoint, colors, null, SKShaderTileMode.Clamp);

            SKPaint paint = new SKPaint
            {
                Style = SKPaintStyle.Fill,
                Shader = shader
            };

            canvas.DrawRect(new SKRect(0, 0, info.Width, info.Height), paint);
        }
    }
}

【问题讨论】:

    标签: ios xamarin.forms skiasharp


    【解决方案1】:

    我遇到了同样的问题并阅读了文档。它说你需要告诉画布更新。您可以使用以下代码行来执行此操作:

    canvasView.InvalidateSurface();
    

    【讨论】:

      【解决方案2】:

      也许您尚未将 NuGet(SkiaSharp 和 SkiaSharp.Views.Forms)安装到 iOS 项目中?

      我将您的代码复制粘贴到一个全新的应用程序中,它第一次运行。

      其他一些可能是问题的原因是视图高度/宽度为 0。或者,颜色透明的狡猾情况。

      【讨论】:

      • 谢谢,这很有趣。我创建了一个空白的新项目,现在它也不能在 Android 上运行。通过它调试,我可以看到 Control 的 OnCanvasViewPaintSurface 方法从未被调用过。大概我在我的 XAML 或其他地方遗漏了一些东西来触发这个。
      • 您必须确保画布大小不是 0x0。什么是布局/容器?您可能需要在渐变视图上设置大小或布局选项。
      • 我试过设置布局/大小选项,但没有区别。如果我给控件一个显示的背景颜色。但我很欣赏这不一定与画布大小有关
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多