Xamarin Forms 上的 SkiaSharp 文本大小

SkiaSharp Text Size on Xamarin Forms

SKPaint 对象上的 TextSize 属性 与 'standard' Xamarin Forms FontSize 有何关系?

在图片中,您可以看到标签上的 40 号尺寸与涂漆尺寸之间的差异。我需要怎么做才能使它们大小相同?

我认为问题出在 Xamarin.Forms 处理字体大小的方式上。例如,在 Android 上,您可以以像素 (px)、比例无关像素 (sp)、英寸 (in)、毫米和密度无关像素 (dp/dip) 为单位定义字体大小。

我不记得 Xamarin.Forms 是如何处理大小(px、sp 或 dp)的,但您在这里看到的差异就是因为这个。您可以做的是创建一个 Effect 来更改本机控件上的字体大小处理,并尝试匹配 SkiaSharp 提供的大小。

正如@hankide 提到的,这与本机 OS 具有针对 UI 元素的缩放这一事实有关,因此应用程序 "looks the same size" 在不同的设备上。

这非常适合按钮以及 OS 正在绘制的所有内容。因此,如果按钮更大,OS 只会放大文本。但是,对于 SkiaSharp,我们不知道您在绘制什么,因此我们无法进行任何缩放。如果我们缩放,图像在高分辨率屏幕上会变得模糊或像素化。

让所有东西大小相同的一种方法是在绘制任何东西之前进行全局缩放:

var scale = canvasWidth / viewWidth;
canvas.Scale(scale);

这通常就足够了,但有时您真的想在高分辨率屏幕上以不同方式绘制项目。一个例子是平铺背景。不要在更大的 canvas 上拉伸图像,您可能只想平铺它 - 保留像素。

对于这个问题,你可以在绘制之前缩放整个canvas,或者你可以只缩放文本:

var paint = new SKPaint {
    TextSize = 40 * scale
};

这样一来,文字变大了,但绘图的其余部分变大了canvas。

我在 GitHub 上有一个例子:https://github.com/mattleibow/SkiaSharpXamarinFormsDemo

这会比较 Xamarin.Forms、SkiaSharp 和 Native 标签。 (它们的尺寸应该完全一样)