估计字体大小
Label和Button上的FontSize属性指定从下边界到下边界顶部的字体字符的大致高度,通常(取决于字体)还包括变音符号。 在大多数情况下,您需要将此属性设置为由Device.GetNamedSize方法返回的值。 这允许您指定NamedSize枚举的成员:Default,Micro,Small,Medium或Large。
或者,您可以将FontSize属性设置为实际的数字字体大小,但会涉及一些小问题(稍后将详细讨论)。 大多数情况下,您可以在整个Xamarin.Forms中使用的设备无关单元中指定字体大小,这意味着您可以根据平台分辨率计算设备无关的字体大小。
例如,假设您想在程序中使用12点字体。 你应该知道的第一件事是,尽管12磅字体可能对于印刷材料或桌面屏幕来说是舒适的尺寸,但在手机上它相当大。 但让我们继续。
英寸有72点,所以12点字体是一英寸的六分之一。 DPI分辨率为160,这是大约27个独立于设备的单元。
我们来编写一个名为FontSizes的小程序,该程序以类似于第3章中的NamedFontSizes程序的显示开始,但随后显示一些带有数字点大小的文本,并使用设备分辨率转换为设备独立单元:
-
public class FontSizesPage : ContentPage
-
{
-
public FontSizesPage()
-
{
-
BackgroundColor = Color.White;
-
StackLayout stackLayout = new StackLayout
-
{
-
HorizontalOptions = LayoutOptions.Center,
-
VerticalOptions = LayoutOptions.Center
-
};
-
-
// Do the NamedSize values.
-
NamedSize[] namedSizes =
-
{
-
NamedSize.Default, NamedSize.Micro, NamedSize.Small,
-
NamedSize.Medium, NamedSize.Large
-
};
-
-
foreach (NamedSize namedSize in namedSizes)
-
{
-
double fontSize = Device.GetNamedSize(namedSize, typeof(Label));
-
stackLayout.Children.Add(new Label
-
{
-
Text = String.Format("Named Size = {0} ({1:F2})",
-
namedSize, fontSize),
-
FontSize = fontSize,
-
TextColor = Color.Black
-
});
-
}
-
-
// Resolution in device-independent units per inch.
-
double resolution = 160;
-
-
// Draw horizontal separator line.
-
stackLayout.Children.Add(
-
new BoxView
-
{
-
Color = Color.Accent,
-
HeightRequest = resolution / 80
-
});
-
-
// Do some numeric point sizes.
-
int[] ptSizes = { 4, 6, 8, 10, 12 };
-
foreach (double ptSize in ptSizes)
-
{
-
double fontSize = resolution * ptSize / 72;
-
stackLayout.Children.Add(new Label
-
{
-
Text = String.Format("Point Size = {0} ({1:F2})",
-
ptSize, fontSize),
-
FontSize = fontSize,
-
TextColor = Color.Black
-
});
-
}
-
-
Content = stackLayout;
-
}
-
}
为了便于在三个屏幕之间进行比较,背景已统一设置为白色,标签为黑色。 注意BoxView插入到两个foreach块之间的StackLayout中:HeightRequest设置使其与设备无关的高度约为八十英寸,并且类似于水平线。
有趣的是,基于计算的结果视觉大小在平台之间比命名大小更一致。 括号中的数字是设备独立单元中的数字FontSize值:
阅读(3875) | 评论(0) | 转发(0) |