当前位置: 首页 > news >正文

第十七章:掌握网格(三)

网格条形图
由Grid的Children集合定义的AddVertical和AddHorizontal方法可以一次性将整个视图集合添加到Grid。 默认情况下,新行或列的高度或宽度为“*”(星号),因此生成的Grid包含多个行或列,每个行或列的大小相同。
让我们使用AddHorizontal方法制作一个小条形图,其中包含50个具有随机高度的BoxView元素。 GridBarChart程序的XAML文件定义了一个AbsoluteLayout,它是Grid和Frame的父级。 此框架用作覆盖图,以显示条形图中特定条形图的信息。 它的Opacity设置为0,因此它最初是不可见的:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="GridBarChart.GridBarChartPage">
   <AbsoluteLayout>
 
        <!-- Grid occupying entire page. -->
        <Grid x:Name="grid"
              ColumnSpacing="1"
              AbsoluteLayout.LayoutBounds="0, 0, 1, 1"
              AbsoluteLayout.LayoutFlags="All" />
 
        <!-- Overlay in center of screen. -->
       <Frame x:Name="overlay"
              OutlineColor="Accent"
              BackgroundColor="#404040"
              Opacity="0"
              AbsoluteLayout.LayoutBounds="0.5, 0.5, AutoSize, AutoSize"
              AbsoluteLayout.LayoutFlags="PositionProportional">
 
            <Label x:Name="label"
                   TextColor="White"
                   FontSize="Large" />
        </Frame>
    </AbsoluteLayout>
</ContentPage>

代码隐藏文件创建了50个BoxView元素,其随机HeightRequest属性介于0和300之间。此外,每个BoxView的StyleId属性都被赋予一个字符串,该字符串由交替的随机辅音和元音组成,类似于某个名称(可能是某个人) 来自另一个星球)。 所有这些BoxView元素都累积在一个通用的List集合中,然后添加到Grid中。 该作业是构造函数中的大部分代码:

public partial class GridBarChartPage : ContentPage
{
    const int COUNT = 50;
    Random random = new Random();
    public GridBarChartPage()
    {
        InitializeComponent();
        List<View> views = new List<View>();
        TapGestureRecognizer tapGesture = new TapGestureRecognizer();
        tapGesture.Tapped += OnBoxViewTapped;
        // Create BoxView elements and add to List.
        for (int i = 0; i < COUNT; i++)
        {
            BoxView boxView = new BoxView
            {
                Color = Color.Accent,
                HeightRequest = 300 * random.NextDouble(),
                VerticalOptions = LayoutOptions.End,
                StyleId = RandomNameGenerator()
            };
            boxView.GestureRecognizers.Add(tapGesture);
            views.Add(boxView);
        }
        // Add whole List of BoxView elements to Grid.
        grid.Children.AddHorizontal(views);
        // Start a timer at the frame rate.
        Device.StartTimer(TimeSpan.FromMilliseconds(15), OnTimerTick);
    }
    // Arrays for Random Name Generator.
    string[] vowels = { "a", "e", "i", "o", "u", "ai", "ei", "ie", "ou", "oo" };
    string[] consonants = { "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
                            "n", "p", "q", "r", "s", "t", "v", "w", "x", "z" };
    string RandomNameGenerator()
    {
        int numPieces = 1 + 2 * random.Next(1, 4);
        StringBuilder name = new StringBuilder();
        for (int i = 0; i < numPieces; i++)
        {
            name.Append(i % 2 == 0 ?
            consonants[random.Next(consonants.Length)] :
            vowels[random.Next(vowels.Length)]);
        }
        name[0] = Char.ToUpper(name[0]);
        return name.ToString();
    }
    // Set text to overlay Label and make it visible.
    void OnBoxViewTapped(object sender, EventArgs args)
    {
        BoxView boxView = (BoxView)sender;
        label.Text = String.Format("The individual known as {0} " +
                                   "has a height of {1} centimeters.",
                                   boxView.StyleId, (int)boxView.HeightRequest);
        overlay.Opacity = 1;
    }
    // Decrease visibility of overlay.
    bool OnTimerTick()
    {
        overlay.Opacity = Math.Max(0, overlay.Opacity - 0.0025);
        return true;
    }
}

Children集合的AddHorizontal方法将多个BoxView元素添加到网格中,并为它们提供顺序的Grid.Column设置。 默认情况下,每列的宽度为“*”(星号),因此每个BoxView的宽度相同,而高度由HeightRequest设置控制。 在XAML文件中设置为网格的间距值1提供了条形图条形之间的一点间隔:
201810012051330408
当您将手机侧向转动以增加宽度时,条形更明显:
201810012052200409
此程序还有另一个功能:当您点击其中一个条形图时,覆盖图将变为可见并显示有关该条形图条的信息 - 特别是来自StyleId的行星际访客名称和条形图的高度。 但是构造函数中设置的计时器会不断降低叠加层上的不透明度值,因此此信息会逐渐淡出视图:
201810012054210410
即使没有原生图形系统,Xamarin.Forms也能够显示看起来非常像图形的东西。

相关文章:

  • 现代软件工程 期中/期末总结博客作业
  • [转]CentOS 6.5安全加固及性能优化
  • NDK编译可执行文件
  • TCP协议学习总结(上)
  • cocos2dx 屏幕触摸
  • js 属性getset
  • PHP之curl put方式提交与接受数据
  • [Android Pro] AndroidX重构和映射
  • Eclipse SVN插件检出Src下面的包变成了文件夹解决
  • 科学家研发出3D打印韧带 使用电力来制造纤维
  • Loadrunner 关于参数赋值取值的操作
  • 核心组件
  • EF 常见语句以及sql语句简单 后续继续添加
  • Javascript -- 精通Math对象
  • 基于TLS(线程局部存储)的高效timelog实现
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • GraphQL学习过程应该是这样的
  • JavaScript中的对象个人分享
  • JavaWeb(学习笔记二)
  • Java的Interrupt与线程中断
  • node-glob通配符
  • 程序员最讨厌的9句话,你可有补充?
  • 关于for循环的简单归纳
  • 欢迎参加第二届中国游戏开发者大会
  • 技术:超级实用的电脑小技巧
  • 来,膜拜下android roadmap,强大的执行力
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 设计模式 开闭原则
  • 使用docker-compose进行多节点部署
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 详解NodeJs流之一
  • 小程序button引导用户授权
  • 正则与JS中的正则
  • 中文输入法与React文本输入框的问题与解决方案
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Panda3d 碰撞检测系统介绍
  • #微信小程序:微信小程序常见的配置传值
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (9)STL算法之逆转旋转
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)图像的%2线性拉伸
  • (转)大道至简,职场上做人做事做管理
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .chm格式文件如何阅读
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net中ListT 泛型转成DataTable、DataSet
  • /etc/sudoer文件配置简析
  • @SentinelResource详解