Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5439196
  • 博文数量: 895
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8691
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(895)

文章存档

2021年(2)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2018-06-05 11:19:05

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
        };
    }
} 

如果你真的拿着尺子到手机屏幕上的物体上,你会发现它不是所需的尺寸,但确实接近它,因为这些屏幕截图还证实:
5_1
这个程序是打算在手机上运行。 如果您想在平板电脑上运行它,则可以使用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值:
5_2

阅读(2274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~