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

简介:

叠加

在AbsoluteLayout中重叠子项的能力有一些有趣且有用的应用程序,其中包括用有时称为叠加层的东西掩盖整个用户界面的能力。也许您的页面正在执行冗长的工作,并且您不希望用户在作业完成之前与页面进行交互。您可以在页面上放置半透明叠加层,也可以显示ActivityIndi​​cator或ProgressBar。
这是一个名为SimpleOverlay的程序,它演示了这种技术。 XAML文件以填充整个页面的AbsoluteLayout开头。 AbsoluteLayout的第一个子节点是Stack?Layout,您也想要填充页面。但是,StackLayout上填充的默认Horizo​​ntalOptions和VerticalOptions设置不适用于AbsoluteLayout的子项。相反,StackLayout通过使用AbsoluteLayout.LayoutBounds和AbsoluteLayout.LayoutFlags附加的可绑定属性来填充AbsoluteLayout:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="SimpleOverlay.SimpleOverlayPage">
    <AbsoluteLayout>
        <StackLayout AbsoluteLayout.LayoutBounds="0, 0, 1, 1"
                     AbsoluteLayout.LayoutFlags="All">
            <Label Text=
"This might be a page full of user-interface objects except
that the only functional user-interface object on the page 
is a Button."
                   FontSize="Medium"
                   VerticalOptions="CenterAndExpand"
                   HorizontalTextAlignment="Center" />
            <Button Text="Run 5-Second Job"
                    FontSize="Large"
                    VerticalOptions="CenterAndExpand"
                    HorizontalOptions="Center"
                    Clicked="OnButtonClicked" />
            <Button Text="A Do-Nothing Button"
                    FontSize="Large"
                    VerticalOptions="CenterAndExpand"
                    HorizontalOptions="Center" />
            <Label Text=
"This continues the page full of user-interface objects except
that the only functional user-interface object on the page 
is the Button."
                   FontSize="Medium"
                   VerticalOptions="CenterAndExpand"
                   HorizontalTextAlignment="Center" />
        </StackLayout> 
 
        <!-- Overlay -->
        <ContentView x:Name="overlay"
                     AbsoluteLayout.LayoutBounds="0, 0, 1, 1"
                     AbsoluteLayout.LayoutFlags="All"
                     IsVisible="False"
                     BackgroundColor="#C0808080"
                     Padding="10, 0">
            <ProgressBar x:Name="progressBar"
                         VerticalOptions="Center" />
 
        </ContentView>
    </AbsoluteLayout>
</ContentPage>

AbsoluteLayout的第二个子项是ContentView,它也填充AbsoluteLayout并且基本上位于StackLayout之上。但是,请注意IsVisible属性设置为False,这意味着此ContentView及其子项不参与布局。 Con?tentView仍然是AbsoluteLayout的子代,但是当布局系统调整大小并渲染页面的所有元素时,它就会被跳过。
此ContentView是叠加层。当IsVisible设置为True时,它会阻止用户对其下方视图的输入。 BackgroundColor设置为半透明灰色,ProgressBar在其中垂直居中。
ProgressBar类似于没有拇指的滑块。 ProgressBar始终是水平定向的。除非您还设置了WidthRequest属性,否则不要将ProgressBar的Horizo​​ntalOptions属性设置为Start,Center或End。
程序可以通过将ProgressBar的Progress属性设置为0到1之间的值来指示进度。这在程序中唯一功能Button的Clicked处理程序中进行了演示。此处理程序模拟在代码中执行的冗长作业,该计时器确定何时经过五秒:

public partial class SimpleOverlayPage : ContentPage
{
    public SimpleOverlayPage()
    {
        InitializeComponent();
    }
    void OnButtonClicked(object sender, EventArgs args)
    {
        // Show overlay with ProgressBar.
        overlay.IsVisible = true;
        TimeSpan duration = TimeSpan.FromSeconds(5);
        DateTime startTime = DateTime.Now;
        // Start timer.
        Device.StartTimer(TimeSpan.FromSeconds(0.1), () =>
        {
            double progress = (DateTime.Now - startTime).TotalMilliseconds /
            duration.TotalMilliseconds;
            progressBar.Progress = progress;
            bool continueTimer = progress < 1;
            if (!continueTimer)
            {
                // Hide overlay.
                overlay.IsVisible = false;
            }
            return continueTimer;
        });
    }
}

Clicked处理程序首先将overlay的IsVisible属性设置为true,从而重现覆盖及其子ProgressBar,并防止与下面的用户界面进一步交互。 计时器设置为十分之一秒,并根据已用时间计算ProgressBar的新Progress属性。 当五秒钟结束时,再次隐藏覆盖并且计时器回调返回false。
这是覆盖页面的覆盖层和正在进行的漫长工作的样子:
201809022137450399
覆盖不必限于ProgressBar或ActivityIndicator。 您可以包含“取消”按钮或其他视图。

目录
相关文章
|
3月前
|
前端开发 开发者 UED
Web前端布局的救赎:掌握清除浮动的艺术,告别布局混乱!
【8月更文挑战第23天】在Web前端开发中,浮动(float)是一种常用的CSS布局技术,但会导致父元素高度塌陷。清除浮动至关重要,常用方法包括:使用额外的清除元素、伪元素、`overflow`属性、`flexbox`布局、`grid`布局以及`clearfix`方法。每种方法各有优缺点,适用于不同场景。随着新技术的发展,开发者应持续学习,选择合适的方法以确保布局稳定性和提升用户体验。
40 0
|
3月前
|
前端开发 UED
设计新潮流:CSS动画毛玻璃按钮,展开效果引人入胜!
设计新潮流:CSS动画毛玻璃按钮,展开效果引人入胜!
|
前端开发
前端学习案例1-圣杯布局1
前端学习案例1-圣杯布局1
78 0
前端学习案例1-圣杯布局1
文字处理技术:试图通过多次布局解决布局问题的思路是否可以避免?
文字处理技术:试图通过多次布局解决布局问题的思路是否可以避免?
110 0
|
算法
文字处理技术:布局的核心是行布局,难点是换行算法
文字处理技术:布局的核心是行布局,难点是换行算法
431 0
文字处理技术:页面布局时,有两个方向
文字处理技术:页面布局时,有两个方向
134 0
文字处理技术:正式开始新布局工作
文字处理技术:正式开始新布局工作
118 0
|
前端开发 JavaScript 算法
Flexbox布局中不为人知的细节
长文预警,关于Flexbox看这个就够了。
Flexbox布局中不为人知的细节
|
JavaScript Android开发