【发布时间】:2017-03-10 11:13:33
【问题描述】:
SKPaint 对象上的 TextSize 属性与“标准”Xamarin Forms FontSize 有何关系?
在图片中,您可以看到标签上的 40 码与涂漆时的区别。我需要做什么才能使它们的大小相同?
【问题讨论】:
标签: xamarin xamarin.forms skiasharp
SKPaint 对象上的 TextSize 属性与“标准”Xamarin Forms FontSize 有何关系?
在图片中,您可以看到标签上的 40 码与涂漆时的区别。我需要做什么才能使它们的大小相同?
【问题讨论】:
标签: xamarin xamarin.forms skiasharp
正如@hankide 所提到的,这与原生操作系统对 UI 元素进行缩放的事实有关,因此应用在不同设备上“看起来大小相同”。
这对于按钮和操作系统正在绘制它们的所有内容非常有用。因此,如果按钮更大,操作系统只会放大文本。但是,使用 SkiaSharp,我们不知道您在绘制什么,因此我们无法进行任何缩放。如果我们进行缩放,图像会在高分辨率屏幕上变得模糊或像素化。
让所有东西都保持相同大小的一种方法是在绘制任何东西之前进行全局缩放:
var scale = canvasWidth / viewWidth;
canvas.Scale(scale);
这通常已经足够好,但有时您真的想在高分辨率屏幕上以不同的方式绘制项目。一个例子是平铺背景。与其在更大的画布上拉伸图像,您可能只想平铺它 - 保留像素。
在这个问题的情况下,您可以在绘制之前缩放整个画布,也可以只缩放文本:
var paint = new SKPaint {
TextSize = 40 * scale
};
这样,文本的大小增加了,但绘图的其余部分在更大的画布上。
我在 GitHub 上有一个示例:https://github.com/mattleibow/SkiaSharpXamarinFormsDemo
这比较 Xamarin.Forms、SkiaSharp 和 Native 标签。 (它们的大小应该完全相同)
【讨论】:
我认为问题在于 Xamarin.Forms 处理字体大小的方式。例如在 Android 上,您可以以像素 (px)、与比例无关的像素 (sp)、英寸 (in)、毫米和与密度无关的像素 (dp/dip) 为单位定义字体大小。
我不记得 Xamarin.Forms 是如何处理大小(px、sp 或 dp)的,但您在此处看到的差异正是因为如此。您可以做的是创建一个效果,更改本机控件上的字体大小处理并尝试匹配 SkiaSharp 提供的大小。
【讨论】:
paint.TextSize = 40 * density .