Metrical大小
现在您已经知道Xamarin.Forms应用程序中的大小与英寸和厘米的度量尺寸大致相对应,您可以调整元素的大小以使它们在各种设备上大小相同。 这里有一个名为MetricalBoxView的程序,它显示一个宽约1厘米,高约1英寸的BoxView:
public class MetricalBoxViewPage : ContentPage
{
public MetricalBoxViewPage()
{
Content = new BoxView
{
Color = Color.Accent,
WidthRequest = 64,
HeightRequest = 160,
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
};
}
}
如果你真的拿着尺子到手机屏幕上的物体上,你会发现它不是所需的尺寸,但确实接近它,因为这些屏幕截图还证实:
这个程序是打算在手机上运行。 如果您想在平板电脑上运行它,则可以使用Device.Idiom属性为iPad和Windows平板电脑设置较小的因子。
估计的字体大小
Label和Button上的FontSize属性指定从下边界到下边界顶部的字体字符的大致高度,通常(取决于字体)还包括变音符号。 在大多数情况下,您需要将此属性设置为由Device.GetNamedSize方法返回的值。 这允许您指定NamedSize枚举的成员:
默认,微型,小型,中型或大型。
或者,您可以将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值: