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

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

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

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-08-30 19:44:11

比例尺寸和定位

如您所见,ChessboardDynamic程序根据AbsoluteLayout本身的大小重新定位BoxView子项并调整其大小。 换句话说,每个孩子的大小和位置与容器的大小成比例。 有趣的是,AbsoluteLayout通常就是这种情况,如果AbsoluteLayout自动适应这种情况可能会很好。
它确实!
AbsoluteLayout定义了第二个附加的可绑定属性,名为LayoutFlagsProperty,还有两个静态方法,名为SetLayoutFlags和GetLayoutFlags。 设置此附加的可绑定属性允许您指定与AbsoluteLayout的大小成比例的子位置坐标或大小(或两者)。 在布置孩子时,AbsoluteLayout会对这些孩子进行扩展
适当的坐标和大小。
您可以选择此功能如何与AbsoluteLayoutFlags枚举的一个或多个成员一起使用:

  • None (equal to 0)
  • XProportional (1)
  • YProportional (2)
  • PositionProportional (3)
  • WidthProportional (4)
  • HeightProportional (8)
  • SizeProportional (12)
  • All (xFFFFFFFF)

您可以使用两个静态方法在AbsoluteLayout的子项上设置比例位置和大小:

点击(此处)折叠或打开

  1. AbsoluteLayout.SetLayoutBounds(view, rect);
  2. AbsoluteLayout.SetLayoutFlags(view, AbsoluteLayoutFlags.All);
或者,您可以在接受AbsoluteLayoutFlags枚举成员的Children集合上使用Add方法的一个版本:

点击(此处)折叠或打开

  1. absoluteLayout.Children.Add(view, rect, AbsoluteLayoutFlags.All);
例如,如果使用SizeProportional标志并将子项的宽度设置为0.25,将高度设置为0.10,则子项将是AbsoluteLayout宽度的四分之一和高度的十分之一。很容易。
PositionProportional标志是类似的,但它考虑到孩子的大小:位置(0,0)将孩子放在左上角,位置(1,1)将孩子放在较低的位置 - 右上角和(0.5,0.5)的位置使孩子在AbsoluteLayout中居中。考虑到孩子的大小对于某些任务来说是很好的 - 例如将孩子置于AbsoluteLayout中心或者将其显示在右边或底边 - 但对其他任务来说有点尴尬。
这是ChessboardProportional。定位和大小调整的大部分工作已经移回构造函数。 SizeChanged处理程序现在仅通过将AbsoluteLayout的WidthRequest和HeightRequest属性设置为ContentView的宽度和高度的最小值来维持整体宽高比。删除SizeChanged处理,棋盘扩展到页面大小而不是填充。

点击(此处)折叠或打开

  1. public class ChessboardProportionalPage : ContentPage
  2. {
  3.     AbsoluteLayout absoluteLayout;
  4.     public ChessboardProportionalPage()
  5.     {
  6.         absoluteLayout = new AbsoluteLayout
  7.         {
  8.             BackgroundColor = Color.FromRgb(240, 220, 130),
  9.             HorizontalOptions = LayoutOptions.Center,
  10.             VerticalOptions = LayoutOptions.Center
  11.         };
  12.         for (int row = 0; row < 8; row++)
  13.         {
  14.             for (int col = 0; col < 8; col++)
  15.             {
  16.                 // Skip every other square.
  17.                 if (((row ^ col) & 1) == 0)
  18.                     continue;
  19.                 BoxView boxView = new BoxView
  20.                 {
  21.                     Color = Color.FromRgb(0, 64, 0)
  22.                 };
  23.                 Rectangle rect = new Rectangle(col / 7.0, // x
  24.                                                row / 7.0, // y
  25.                                                1 / 8.0, // width
  26.                                                1 / 8.0); // height
  27.                 absoluteLayout.Children.Add(boxView, rect, AbsoluteLayoutFlags.All);
  28.             }
  29.         }
  30.         ContentView contentView = new ContentView
  31.         {
  32.             Content = absoluteLayout
  33.         };
  34.         contentView.SizeChanged += OnContentViewSizeChanged;
  35.         this.Padding = new Thickness(5, Device.OnPlatform(25, 5, 5), 5, 5);
  36.          this.Content = contentView;
  37.     }
  38.     void OnContentViewSizeChanged(object sender, EventArgs args)
  39.     {
  40.         ContentView contentView = (ContentView)sender;
  41.         double boardSize = Math.Min(contentView.Width, contentView.Height);
  42.         absoluteLayout.WidthRequest = boardSize;
  43.         absoluteLayout.HeightRequest = boardSize;
  44.     }
  45. }
屏幕看起来与ChessboardDynamic程序相同。
每个BoxView都使用以下代码添加到AbsoluteLayout。 所有分母都是浮点值,因此除法的结果将转换为double:

点击(此处)折叠或打开

  1. Rectangle rect = new Rectangle(col / 7.0, // x
  2.                                row / 7.0, // y
  3.                                1 / 8.0, // width
  4.                                1 / 8.0); // height
  5. absoluteLayout.Children.Add(boxView, rect, AbsoluteLayoutFlags.All);
宽度和高度始终等于AbsoluteLayout的宽度和高度的八分之一。 这很清楚。 但是对于相对x和y坐标,row和col变量除以7(而不是8)。 for循环中的row和col变量的范围是0到7.行和col值0对应于left或top,但row和col值7必须映射到x和y坐标1以将子项定位到 右边或底边。
如果您认为可能需要一些可靠的规则来获得比例坐标,请继续阅读。
阅读(2337) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~