第十四章:绝对布局(四)

简介:

使用比例坐标

在AbsoluteLayout中使用比例定位可能很棘手。 有时您需要补偿考虑到大小的内部计算。 例如,您可能更喜欢指定坐标,以便X值为1表示子项的左边缘位于AbsoluteLayout的右边缘,您需要将其转换为AbsoluteLayout理解的坐标。
在下面的讨论中,一个不考虑大小的坐标 - 一个坐标,其中1表示子项位于AbsoluteLay的右边缘或底边之外? - 被称为小数坐标。本节的目标是开发将小数坐标转换为可与AbsoluteLayout一起使用的比例坐标的规则。此配置文件要求您知道子视图的大小。
假设您将名为child的视图放在名为absoluteLayout的AbsoluteLayout中,并为名为layoutBounds的子项设置布局边界矩形。让我们将此分析限制为水平坐标和大小。垂直坐标和尺寸的过程相同。
这个孩子必须先以某种方式获得宽度。子节点可以计算自己的宽度,或者可以通过LayoutBounds附加属性为与设备无关的单元分配宽度。但是我们假设设置了AbsoluteLayoutFlags.WidthProportional标志,这意味着宽度是根据布局边界的宽度字段和AbsoluteLay的宽度来计算的:

child.Width = layoutBounds.Width * absoluteLayout.Width

如果还设置了AbsoluteLayoutFlags.XProportional标志,那么AbsoluteLayout内部通过考虑子项的大小来计算子项相对于自身的坐标:

relativeChildCorrdinate.X = (absoluteLayout.Width - child.Width) * layoutBounds.X

例如,如果AbsoluteLayout的宽度为400,而子节点的宽度为100,而layoutBounds.X为0.5,则relativeChildCoordinate.X计算为150.这意味着子节点的左边缘为150 来自父级左边缘的像素。 这会导致子项在AbsoluteLayout中水平居中。
也可以计算小数子坐标:

fractionalChildCoordinate.X = relativeChildCoordinate.X / absoluteLayout.Width

这与比例坐标不同,因为小数子坐标为1意味着孩子的左边缘恰好位于AbsoluteLayout的右边缘之外,因此子项位于AbsoluteLayout的表面之外。 要继续该示例,小数子坐标为150除以400或0.375。 子视图的左侧位于(0.375 * 400)或距离AbsoluteLayout左边缘150个单位。
让我们重新排列公式的术语,计算要为layoutBounds.X求解的相对子坐标:

layoutBounds.X = relativeChildCoordinate.X / (absoluteLayout.WIdth - child.Width)

让我们将该比率的顶部和底部除以AbsoluteLayout的宽度:

layoutBounds.X = fractionalChildCoordinate.X / (1 - child.Width / absoluteLayout.Width)

如果你也使用比例宽度,那么分母中的那个比例是layoutBounds.Width:

layoutBounds.X = fractionalChildCoordinate.X / ( 1 - layoutBounds.Width)

这通常是一个非常方便的公式,因为它允许您从小数子坐标转换为比例坐标,以便在布局边界矩形中使用。
在ChessboardProportional示例中,当col等于7时,fractionalChildCoordi?nate.X为7除以列数(8)或7/8。 分母是1减1/8(正方形的比例宽度),或者再次是7/8。 比例为1。
让我们看一个公式在代码中应用于小数坐标的示例。 Propor tionalCoordinateCalc程序尝试使用粉红色AbsoluteLayout上的八个蓝色BoxView元素重现这个简单的图形:
201808312155150396

整个数字有2:1的比例。 您可以将该图视为包含四个水平矩形和四个垂直矩形。 顶部和底部的水平蓝色矩形对具有0.1个分数单位的高度(相对于AbsoluteLayout的高度),并且从顶部和底部以及彼此之间间隔0.1个单位。 垂直的蓝色矩形看起来间隔和尺寸相似,但由于纵横比为2:1,垂直矩形的宽度为0.05个单位,并且从左侧和右侧以及彼此之间间隔0.05个单位。
AbsoluteLayout在XAML文件中定义并居中,并以粉红色着色:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ProportionalCoordinateCalc.ProportionalCoordinateCalcPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness"
                    iOS="5, 25, 5, 5"
                    Android="5"
                    WinPhone="5" />
    </ContentPage.Padding>
    <ContentView SizeChanged="OnContentViewSizeChanged">
        <AbsoluteLayout x:Name="absoluteLayout"
                        BackgroundColor="Pink"
                        HorizontalOptions="Center"
                        VerticalOptions="Center" />
    </ContentView>
</ContentPage>

代码隐藏文件定义了一个Rectangle结构数组,其中包含八个BoxView元素中每个元素的小数坐标。 在foreach循环中,程序应用上面显示的最终公式的略微变化。 而不是分母等于1减去布局的值?Bounds.Width(或layoutBounds.Height),它使用小数界限的宽度(或高度),它是相同的值。

public partial class ProportionalCoordinateCalcPage : ContentPage
{
    public ProportionalCoordinateCalcPage()
    {
        InitializeComponent();
        Rectangle[] fractionalRects = 
        {
            new Rectangle(0.05, 0.1, 0.90, 0.1), // outer top
            new Rectangle(0.05, 0.8, 0.90, 0.1), // outer bottom
            new Rectangle(0.05, 0.1, 0.05, 0.8), // outer left
            new Rectangle(0.90, 0.1, 0.05, 0.8), // outer right
            new Rectangle(0.15, 0.3, 0.70, 0.1), // inner top
            new Rectangle(0.15, 0.6, 0.70, 0.1), // inner bottom
            new Rectangle(0.15, 0.3, 0.05, 0.4), // inner left
            new Rectangle(0.80, 0.3, 0.05, 0.4), // inner right
        };
        foreach (Rectangle fractionalRect in fractionalRects)
        {
            Rectangle layoutBounds = new Rectangle
            {
                // Proportional coordinate calculations.
                X = fractionalRect.X / (1 - fractionalRect.Width),
                Y = fractionalRect.Y / (1 - fractionalRect.Height),
                Width = fractionalRect.Width,
                Height = fractionalRect.Height
            };
            absoluteLayout.Children.Add(
                new BoxView
                {
                    Color = Color.Blue
                },
                layoutBounds,
                AbsoluteLayoutFlags.All);
        }
    }
    void OnContentViewSizeChanged(object sender, EventArgs args)
    {
        ContentView contentView = (ContentView)sender;
        // Figure has an aspect ratio of 2:1.
        double height = Math.Min(contentView.Width / 2, contentView.Height);
        absoluteLayout.WidthRequest = 2 * height;
        absoluteLayout.HeightRequest = height;
    }
}

SizeChanged处理程序只是修复了宽高比。
这是结果:
201808312217330397
而且,当然,您可以将手机侧向转动,并在横向模式下看到更大的数字,您必须通过侧向翻书来查看:
201808312217590398

目录
相关文章
|
5月前
|
存储 监控 安全
C语言与操作系统交互探秘
系统调用与库函数 在 C语言中,系统调用是用户程序与操作系统内核交互的桥梁。以下是常见系统调用的概述: 文件操作类:open()、read()、write()、close()、lseek() 进程控制类:fork()、exec()、wait()、exit() 信号处理类:signal()、kill() 进程间通信:pipe()、shmget()、msgget() 网络通信:socket()、bind()、listen()、accept() 系统调用 vs 库函数:
164 20
|
数据采集 存储 JavaScript
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
本文介绍了如何使用Python编写网络爬虫程序爬取书旗网上的小说数据,并通过逆向工程对抗网站的反爬机制,最后对采集的数据进行可视化分析。
695 109
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
|
监控 Java
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
303 0
|
7月前
|
机器学习/深度学习
阿里妈妈首提AIGB并实现大规模商业化落地,将在NeurIPS 2024正式开源Benchmark
阿里妈妈提出AI-Generated Bidding(AIGB)新范式及DiffBid生成式竞价模型,突破传统基于强化学习的自动竞价方法局限。AIGB将自动竞价视为生成问题,通过捕捉复杂依赖关系,提升长期规划和随机环境中的稳定性和效果。DiffBid基于条件扩散建模,灵活生成满足特定目标的竞价轨迹,显著提升GMV和ROI。实验结果表明,DiffBid实现了2.81%的GMV增长和3.36%的ROI增长。然而,生成式建模的复杂性也带来了训练和调优的挑战。 论文链接:https://arxiv.org/abs/2405.16141
278 9
|
10月前
大规模、动态语音增强/分离新基准!清华发布移动音源仿真平台SonicSim,含950+小时训练数据
清华大学研究团队推出SonicSim,一款专为语音增强和分离技术设计的移动音源仿真平台。它基于Habitat-sim开发,能生成高度可定制的合成数据,涵盖多个层次的调整选项,有效解决了现有数据集在数量和多样性上的不足。SonicSim不仅提升了模型训练和评估的真实性和全面性,还通过构建SonicSet基准数据集,进一步推动了该领域的研究进展。
196 20
|
数据采集 机器学习/深度学习 人工智能
云服务器可以用来做什么?云服务器使用场景列举
阿里云服务器经常推出一些拼团或者秒杀活动,很多同学看价格不错就抢了。可是云服务器买到手却不知道做什么,新手站长网列举云服务器常见的使用场景,方便大家参考,别再让你的云服务器吃灰了
2248 1
|
存储 安全
云端存储,多设备同步——WPS Office 2022让你的办公随时随地!{附带下载地址和安装教程}
WPS Office 2022还支持云存储,可以将文档、表格和演示文稿等文件保存到云端,并在不同设备之间进行同步,方便用户随时随地进行办公和分享。同时,它还具有强大的文档安全保护功能,可以对文档进行密码保护、数字签名等多种方式进行保护,确保用户的办公数据安全可靠。
|
存储 编解码 缓存
阿里云CDN+点播服务助力云学堂全面提升用户在线学习体验
CDN将云学堂的点播视频资源缓存至阿里云遍布全球的加速节点上,当终端用户请求访问和获取该资源时,无需回源,系统自动调用离终端用户最近的CDN节点上已缓存的资源,提高用户访问效率和访问速度。
2183 57
阿里云CDN+点播服务助力云学堂全面提升用户在线学习体验
|
机器学习/深度学习 新零售 算法
主动学习入门篇:如何能够显著地减少标注代价
在大数据和算力的助力下,深度学习掀起了一波浪潮,在许多领域取得了显著的成绩。以监督学习为主的深度学习方法,往往期望能够拥有大量的标注样本进行训练,模型能够学到更多有价值的知识(如下左图展示了3组常见的图像分类数据集,拥有上万的标注样本)。
8054 0
主动学习入门篇:如何能够显著地减少标注代价
|
设计模式 缓存 前端开发
Vite2+React+TypeScript:搭建企业级轻量框架实践
前段时间写了个Vue3的工程项目用起来还不错,借此把它移植过来React这边,给大家介绍下Vite2+React+TypeScript如何合理搭建和使用周边插件,以及让他们组合到整个工程中去。
Vite2+React+TypeScript:搭建企业级轻量框架实践