Xamarin表单上的SkiaSharp文本大小

Xamarin表单上的SkiaSharp文本大小,xamarin,xamarin.forms,skiasharp,Xamarin,Xamarin.forms,Skiasharp,SKPaint对象上的TextSize属性与“标准”Xamarin Forms FontSize的关系如何 在图像中,您可以看到标签上的尺寸40与绘制的尺寸40之间的差异。我需要做什么才能使它们的大小相同?我认为问题在于Xamarin.Forms处理字体大小的方式。例如,在Android上,您可以定义字体大小,单位为像素(px)、缩放无关像素(sp)、英寸(in)、毫米和密度无关像素(dp/dip) 我不记得Xamarin.Forms是如何处理大小(px、sp或dp)的,但是您在这里看到的差异就

SKPaint对象上的TextSize属性与“标准”Xamarin Forms FontSize的关系如何


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

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


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

正如@hankide提到的,这与本机操作系统对UI元素进行缩放有关,因此应用程序在不同设备上“看起来大小相同”

这是伟大的按钮和所有这些,因为操作系统正在绘制它们。因此,如果按钮更大,操作系统只会放大文本。但是,使用SkiaSharp,我们不知道您正在绘制什么,因此无法进行任何缩放。如果我们进行缩放,图像在高分辨率屏幕上会变得模糊或像素化

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

var scale=canvasWidth/viewWidth;
画布。比例(比例);
这通常已经足够好了,但有时你真的想在高分辨率屏幕上以不同的方式绘制项目。例如,平铺背景。与在更大的画布上拉伸图像不同,您可能只需要平铺图像-保留像素

对于此问题,您可以在绘制之前缩放整个画布,也可以仅缩放文本:

var paint=new SKPaint{
TextSize=40*刻度
};
这样,文本大小会增加,但图形的其余部分位于更大的画布上

我在GitHub上有一个例子:


这将比较Xamarin.Forms、SkiaSharp和本机标签。(它们的大小应该完全相同)

我来看看发生了什么。。。我认为Xamarin.Forms值也可能乘以屏幕密度。。。您可能可以通过
paint.TextSize=40*密度
逃脱处罚。