第五章:尺寸处理(3)

3870阅读 0评论2018-03-31 renxiao2003
分类:Android平台

估计字体大小

Label和Button上的FontSize属性指定从下边界到下边界顶部的字体字符的大致高度,通常(取决于字体)还包括变音符号。 在大多数情况下,您需要将此属性设置为由Device.GetNamedSize方法返回的值。 这允许您指定NamedSize枚举的成员:Default,Micro,Small,Medium或Large。
或者,您可以将FontSize属性设置为实际的数字字体大小,但会涉及一些小问题(稍后将详细讨论)。 大多数情况下,您可以在整个Xamarin.Forms中使用的设备无关单元中指定字体大小,这意味着您可以根据平台分辨率计算设备无关的字体大小。
例如,假设您想在程序中使用12点字体。 你应该知道的第一件事是,尽管12磅字体可能对于印刷材料或桌面屏幕来说是舒适的尺寸,但在手机上它相当大。 但让我们继续。
英寸有72点,所以12点字体是一英寸的六分之一。 DPI分辨率为160,这是大约27个独立于设备的单元。
我们来编写一个名为FontSizes的小程序,该程序以类似于第3章中的NamedFontSizes程序的显示开始,但随后显示一些带有数字点大小的文本,并使用设备分辨率转换为设备独立单元:


点击(此处)折叠或打开

  1. public class FontSizesPage : ContentPage
  2. {
  3.     public FontSizesPage()
  4.     {
  5.         BackgroundColor = Color.White;
  6.         StackLayout stackLayout = new StackLayout
  7.         {
  8.             HorizontalOptions = LayoutOptions.Center,
  9.             VerticalOptions = LayoutOptions.Center
  10.         };

  11.         // Do the NamedSize values.
  12.         NamedSize[] namedSizes =
  13.         {
  14.             NamedSize.Default, NamedSize.Micro, NamedSize.Small,
  15.             NamedSize.Medium, NamedSize.Large
  16.         };

  17.         foreach (NamedSize namedSize in namedSizes)
  18.         {
  19.             double fontSize = Device.GetNamedSize(namedSize, typeof(Label));
  20.             stackLayout.Children.Add(new Label
  21.                 {
  22.                     Text = String.Format("Named Size = {0} ({1:F2})",
  23.                                                       namedSize, fontSize),
  24.                     FontSize = fontSize,
  25.                     TextColor = Color.Black
  26.                 });
  27.         }

  28.          // Resolution in device-independent units per inch.
  29.          double resolution = 160;

  30.         // Draw horizontal separator line.
  31.         stackLayout.Children.Add(
  32.             new BoxView
  33.             {
  34.                 Color = Color.Accent,
  35.                 HeightRequest = resolution / 80
  36.             });

  37.         // Do some numeric point sizes.
  38.         int[] ptSizes = { 4, 6, 8, 10, 12 };
  39.         foreach (double ptSize in ptSizes)
  40.         {
  41.             double fontSize = resolution * ptSize / 72;
  42.             stackLayout.Children.Add(new Label
  43.                 {
  44.                      Text = String.Format("Point Size = {0} ({1:F2})",
  45.                                                         ptSize, fontSize),
  46.                      FontSize = fontSize,
  47.                      TextColor = Color.Black
  48.                  });
  49.         }

  50.         Content = stackLayout;
  51.     }
  52. }

为了便于在三个屏幕之间进行比较,背景已统一设置为白色,标签为黑色。 注意BoxView插入到两个foreach块之间的StackLayout中:HeightRequest设置使其与设备无关的高度约为八十英寸,并且类似于水平线。
有趣的是,基于计算的结果视觉大小在平台之间比命名大小更一致。 括号中的数字是设备独立单元中的数字FontSize值:


上一篇:第五章:尺寸处理(2)
下一篇:写给Chinuanix的18年感想