在实现网格布局前,SOUI支持两种布局形式:相对布局,和线性布局,其中线性布局是2017年2月份才支持的布局。

这两年工作都在Android这里,Android里有号称5大布局(RelativeLayout, LinearLayout, FrameLayout, GridLayout,TableLayout)。

FrameLayout很简单,在SOUI里一般用TabCtrl就实现了。RelativeLayout和SOUI自己的相对布局功能类似,线性布局也有了,但是一直没有实现GridLayout(TableLayout和GridLayout类似)。

之所以没有做GridLayout,主要是觉得组合SOUI现有的布局功能可以模拟出GridLayout的效果,哲学说:如无必要,勿增实体。

前几天群里有人问做一个行列对齐的布局在SOUI里要怎么实现。我回答说用线性布局去组合。

后来认真想了想,虽然线性布局组合可以勉强达到效果,但是布局写起来还是会很难看,这时候我才感觉到了实现一个GridLayout的必要性。

好在SOUI的布局系统经过前一段时间的重构已经能够很容易的扩展,要实现一个GridLayout也不是什么困难的事。

经过近一周的打磨,SOUI版的GridLayout已经通过了主要的测试,至少能够满足我的布局要求了。

下面我们先看看效果,再看在SOUI里要如何使用。

上面是demos/demo中新增加的两个布局,一个是计算器布局,一个是行列对齐示例。

计算器布局是网络上介绍Android的GridLayout的必备例子,而行列对齐是开发中经常要用到的布局。

先看看上图的计算器布局XML:

           <window pos="10,[5,-10,-10" layout="gridLayout" colorBkgnd="#888888" columnCount="4" rowCount="6" xInterval="5" yInterval="5" xGravity="fill" yGravity="fill">
<edit
size="0,0"
cueText="数值"
columnSpan="4"
rowWeight="2"
/> <button
size="0,0"
text="清除"
columnWeight="1"
rowWeight="1"
colorText="#0000ff"
/> <button
size="0,0"
text="后退"
columnWeight="1"
rowWeight="1"
/> <button
size="0,0"
text="/"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="x"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="7"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="8"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="9"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="-"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="4"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="5"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="6"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="+"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="1"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="2"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="3"
columnWeight="1"
rowWeight="1"
/>
<!--//列 行权重为1-->
<button
size="0,0"
text="="
rowSpan="2"
columnWeight="1"
rowWeight="2"
/>
<button
size="0,0"
text="0"
columnSpan="2"
columnWeight="2"
rowWeight="1"
/>
<!--跨两列 自动填充 列权重2 行权重1-->
<button
size="0,0"
text="."
columnWeight="1"
rowWeight="1"
/>
<!--列 行 权重1--> </window>

上面代码中,首先需要注意的是在window的layout属性里指定为gridLayout。

然后我们指定了columnCount, rowCount, xInterval, yInterval, xGravity, yGravity等属性。这些属性都是GridLayout才有的属性。

在这个window的子控件中,我们把每个控件的size都指定为"0,0", 同时指定了columnWeight, rowWeight属性,这样可以保证大小只受weight控制,不受控件显示内容影响。也可以指定columnSpan, rowSpan来指定行列合并 ,具体属性含义这里不一一介绍,还是参考源代码更好。

计算器的例子演示了平均分割父窗口,GridLayout同样支持适应子窗口。

 <window pos="|0,[5" offset="-0.5,0" layout="gridLayout" columnCount="2" xInterval="5" yInterval="5" xGravity="right" colorBkgnd="#888888">
<text size="-1,-1">所在地:</text>
<edit size="200,50" layout_xGravity="fill">广东 广州</edit> <text size="-1,-1">邮箱:</text>
<edit size="200,-1" layout_xGravity="fill">xx@qq.com</edit> <text size="-1,-1">兴趣:</text>
<edit size="200,-1" layout_xGravity="fill">看小电影</edit> </window>

在上面代码中,我们让这个GridLayout水平居中,宽度是子窗口自适应。在父窗口中我们指定了xGravity="right", 使得它的每一列水平方向默认使用右对齐(如果不指定则是剧中对齐,如这里的垂直方向)。

第一列的3个文本控件都是自适应大小,第二列宽度指定为200,高度则有点变化。上面代码中还指定了一个layout_xGravity="fill"的属性,其实在这里是没有必要的(本来是想演示填充整个父窗口的右边)。

子控件的layout_xGravity和父控件的xGravity是一个主从关系。优先使用子控件指定的属性,如果子控件没有指定,则使用父窗口的属性。

GridLayout就介绍到这里。 UI,just so so!

启程软件  2017.7.5

在SOUI中使用网格布局的更多相关文章

  1. 在SOUI中使用线性布局

    SOUI 2.5.1.1开始支持线性布局(LinearLayout). 要在SOUI布局中使用线性布局, 需要在布局容器窗口里指定布局类型为vbox | hbox, (vbox为垂直线性布局, hbo ...

  2. 第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)

    窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定 ...

  3. Bootstrap3基础教程 02 网格布局

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多列. 网页设计中的网格布局作用:组织内容,让网站易于浏览,并降低用户端 ...

  4. Android中帧布局-FrameLayout和网格布局-GridLayout

    帧布局-FrameLayout 一.概念 帧布局中,容器为每个加入其中的空间创建一个空白的区域(成为一帧).每个空间占据一帧,这些帧会按gravity属性自动对齐. 帧布局的效果是将其中的所有空间叠加 ...

  5. Android笔记(十一) Android中的布局——网格布局

    网格布局是Android4.0新增的布局管理器,因此需要在Android4.0之后的版本才可以使用,之前的平台使用该布局的话,需要导入相应的支持库. GridLayout的作用类似于HTML中的tab ...

  6. CSS中网格布局实战(初级)

    大家好,网格布局是我们在网页布局中经常用到的,那这里我就给大家分享一篇简单的网格布局,让大家能简单明了的了解网格布局的基本内容.闲话不多说,直接进入主题! 第一步,基本的框架结构.这里直接一个div来 ...

  7. CSS3中的display:grid网格布局介绍

    1.网格布局(grid): 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局; 2.基本概念: 容器和项目,如图所示: <div class="content&qu ...

  8. 网格布局GirdLayout在py中的引用,用于多行多列矩阵

    """ GridLayout为网格布局为了部件为多行距阵 """ from kivy.uix.gridlayout import GridL ...

  9. 第二十二篇:在SOUI中使用代码向窗口中插入子窗口

    使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特 ...

随机推荐

  1. 【CSS入门基础,有需要的看过来哦】心境,心静,不轻言放弃!---致CSS

    整理一下近一周学习的有关CSS的基础知识笔记: CSS语法必须写在<style>标签中哦~/*注释*/ [CSS常用背景属性]background background-color:背景色 ...

  2. iOS tableView移除某一行的分割线 让分割线宽度为整个cell的宽度

    移除tableViewCell中某一行的分割线 有2种方法 1. 移除系统的分割线,自己定义每行的分割线 self.tableView.separatorStyle = UITableViewCell ...

  3. xml 和html 语言区别

    都是标记语言(ML),一个是超文本标记语言,一个是扩展标记语言. 不同之处: 1可扩展性:HTML不具备扩展性,而XML是原标记语言,可以用于定义新的标记语言. 2侧重点: HTML侧重于如何表现信息 ...

  4. Sqoop简介及安装

    Hadoop业务的大致开发流程以及Sqoop在业务中的地位: Sqoop概念 Sqoop可以理解为[SQL–to–Hadoop],正如名字所示,Sqoop是一个用来将关系型数据库和Hadoop中的数据 ...

  5. Qzone 高性能 HTTPS 实践

    WeTest导读 自从去年QQ空间移动端页面开始切换到HTTPS之后,页面性能遇到了比较大的挑战,HTTPS对页面访问速度带来了比较大的影响,所以我们通过实践总结了一些能够提升HTTPS页面访问速度的 ...

  6. tornado之文件上传的几种形式form,伪ajax(iframe)

    1直接form提交给后台处理 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  7. js文件下载及命名(兼容多浏览器)

    函数功能:实现主流浏览器的文件下载功能: 兼容性: >=IE10,Edge,chrome,firefox; 与后台的请求方式:GET请求,  url携带参数  url?id=123(隐藏文件真实 ...

  8. MySQL的复制

    1.复制概述1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high avail ...

  9. Windows下用Composer引入官方GitHub扩展包

    Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...

  10. 在Visual Studio for Mac中使用fastlane管理iOS的provision

    Xamarin开发中,最烦的就是provision的管理了. 全手工的话,要先创建一个key,上传后生成cert文件,再创建provision.如果在手机上调试,还要把手机加到provision中去. ...