Sencha Touch 2 快速入门系列(五)-- 布局(Layouts)
来源:互联网 发布:sql培训班 编辑:程序博客网 时间:2024/06/06 23:55
本文已添加至Sencha Touch 2快速入门系列索引:http://blog.csdn.net/ardy_c/article/details/7544470
转载请注明出处:http://blog.csdn.net/ardy_c/article/details/7542256
布局(Layouts)是什么,相信也不用我在这里多说。无论是网页,还是手机应用,我们都需要给自己的版面进行布局。一方面是为了方便用户阅读,一方面是为了版面美观整齐,另外...还有很多很多原因,有兴趣的童孩可以自己去总结下 = =||,和主题无关的,这里不扯谈了,免得浪费大家时间。Sencha Touch 2为了方便大家使用,预定义了几种布局的方式:HBox、VBox、Card、Fit、Docking。
HBox(水平盒子)
正如标题所示,Hbox(水平盒子)是将处于其中的子元素按水平排列起来。如何实现这种布局方式?我们只需要将容器的layout属性设置为'hbox'即可。下面我们来看看一段简单的代码:
Ext.create('Ext.Container', { fullscreen: true, layout: 'hbox', items: [ { xtype: 'panel', html: 'message list', flex: 1 }, { xtype: 'panel', html: 'message preview', flex: 2 } ]});
上面代码创建了一个容器,并采用了hbox的布局方式。在两个子元素里,分别设置了属性flex:1和flex:2。flex属性,是根据比例的方式来计算该组件所占的宽度(因为这里使用的是在水平方向上的排列,flex所计算的就是水平方向上所占的位置,因此这里是定义了宽度;如果是使用vbox,flex计算的就是组件的所占的高度了)。flex的计算方法和我们平时所使用的百分比定义宽度有点区别。例如,这里定义了两个同级元素的flex值分别为1和2,那么他们总的宽度就是3(1+2),也是我们平时习惯使用的100%。然后,flex值为1的占的宽度是1/3,即33.33%;flex值为2的占的宽度是2/3,即66.67%。通过上面的代码所建立的模型大概如下图:
Hbox
大家或者会想到,很多时候我们的内容不一定能占满屏,我们可能需要“左对齐”、“居中”、“右对齐”这些排列方式。可以,没问题!我们可以设置layout的align和pack属性即可实现各种对齐方式。大家可以运行一下以下这段代码看看效果:
Ext.application({ name: 'sample', launch: function() { var container = Ext.create('Ext.Container', { fullscreen: true, layout: { type: 'hbox', align: 'start', pack: 'start' }, items: [ { docked: 'top', xtype: 'titlebar', title: 'HBox Layout' }, { docked: 'top', xtype: 'toolbar', items: [ { xtype: 'container', html: 'Pack: ', style: 'color: #fff; padding: 0 10px; width: 85px;' }, { xtype: 'segmentedbutton', allowDepress: false, items: [ { text: 'Start', handler: function() { layout.setPack('start') }, pressed: true }, { text: 'Center', handler: function() { layout.setPack('center') } }, { text: 'End', handler: function() { layout.setPack('end') } } ] } ] }, { docked: 'top', xtype: 'toolbar', items: [ { xtype: 'container', html: 'Align: ', style: 'color: #fff; padding: 0 10px; width: 85px;' }, { xtype: 'segmentedbutton', allowDepress: false, items: [ { text: 'Start', handler: function() { layout.setAlign('start'); }, pressed: true }, { text: 'Center', handler: function() { layout.setAlign('center'); } }, { text: 'End', handler: function() { layout.setAlign('end'); } }, { text: 'Stretch', handler: function() { layout.setAlign('stretch'); } } ] } ] }, { xtype: 'button', text: 'Btn 1', margin: 2 }, { xtype: 'button', text: 'Btn 2', margin: 2 }, { xtype: 'button', text: 'Btn 3', margin: 2 } ] }); var layout = container.getLayout(); }});
上面代码中,我们将一个数据对象传入到layout中,用于设置layout。数据对象中包含有type、align、pack。type是设置采用哪种布局方式;align在hbox模式中,是指垂直方向上的对齐方式,相当于css里的valign,可选值有start(开始端对齐 / 顶端对齐)、center(居中)、end(末端对齐 / 底部对齐)、stretch(伸展,填满垂直方向上的空间);pack在hbox模式中,是指水平方向上的的对齐方式,相当于css里的align,可选值有start(开始端对齐 / 左对齐)、center(居中)、end(末端对齐 / 右对齐)。运行上面代码,点击下各个按钮,你就可以看到各个值相对应的效果了。
VBox(垂直盒子)
VBox和HBox,非常相似,不同的只是换了排列的方向上,我们来看下面一段代码:
Ext.create('Ext.Container', { fullscreen: true, layout: 'vbox', items: [ { xtype: 'panel', html: 'message list', flex: 1 }, { xtype: 'panel', html: 'message preview', flex: 2 } ]});
代码解析:
这段代码和HBox的第一段代码唯一不同的地方就是这里的layout是设为'vbox',其它的全部一样。这次flex所计算的就是高度,而非宽度了。大概效果如下图所示。
VBox
在对齐方式上,与HBox有点区别,align和pack的功能正好相反,但可选值不变。align在vbox模式中,是指水平方向上的对齐方式,相当于css里的align,可选值有start(开始端对齐 / 左对齐)、center(居中)、end(末端对齐 / 右对齐)、stretch(伸展,填满水平方向上的空间);pack在vbox模式中,是指垂直方向上的的对齐方式,相当于css里的valign,可选值有start(开始端对齐 / 顶端对齐)、center(居中)、end(末端对齐 / 底部对齐)。运行一下以下代码看看效果:
var container = Ext.create('Ext.Container', { fullscreen: true, layout: { type: 'vbox', align: 'start', pack: 'start' }, items: [ { docked: 'top', xtype: 'titlebar', title: 'VBox Layout' }, { docked: 'top', xtype: 'toolbar', items: [ { xtype: 'container', html: 'Pack: ', style: 'color: #fff; padding: 0 10px; width: 85px;' }, { xtype: 'segmentedbutton', allowDepress: false, items: [ { text: 'Start', handler: function() { layout.setPack('start') }, pressed: true }, { text: 'Center', handler: function() { layout.setPack('center') } }, { text: 'End', handler: function() { layout.setPack('end') } } ] } ] }, { docked: 'top', xtype: 'toolbar', items: [ { xtype: 'container', html: 'Align: ', style: 'color: #fff; padding: 0 10px; width: 85px;' }, { xtype: 'segmentedbutton', allowDepress: false, items: [ { text: 'Start', handler: function() { layout.setAlign('start'); }, pressed: true }, { text: 'Center', handler: function() { layout.setAlign('center'); } }, { text: 'End', handler: function() { layout.setAlign('end'); } }, { text: 'Stretch', handler: function() { layout.setAlign('stretch'); } } ] } ] }, { xtype: 'button', text: 'Btn 1', margin: 2 }, { xtype: 'button', text: 'Btn 2', margin: 2 }, { xtype: 'button', text: 'Btn 3', margin: 2 } ]});var layout = container.getLayout();
Card(卡片方式)
当你需要显示很多信息时,一个屏的容量显然不能满足你的需求,这时你可以选用Card(卡片方式)布局方式。卡片方式是指容器内存在多个item,每次只激活显示其中一个,并将该item填满容器,其余的items将被隐藏起来,当有需要的时候,通过调用方法将需要的item激活。
Ext.application({ name: 'sample', launch: function() { var panel = Ext.create('Ext.Panel', { layout: 'card', // 将容器的布局方式设置为卡片方式 items: [ { xtype: 'toolbar', // 创建一个工具栏 docked: 'top', // 停靠在顶部 items:[ // 创建四个按钮 { xtype: 'button', text: 'First', handler: function(){ panel.setActiveItem(0); // 激活第一个模块,即第一屏内容 } }, { xtype: 'button', text: 'Second', handler: function(){ panel.setActiveItem(1); // 激活第二个模块 } }, { xtype: 'button', text: 'Third', handler: function(){ panel.setActiveItem(2); // 激活第三个模块 } }, { xtype: 'button', text: 'Fourth', handler: function(){ panel.setActiveItem(3); // 激活第四个模块 } } ] }, { html: "First Item" }, { html: "Second Item" }, { html: "Third Item" }, { html: "Fourth Item" } ] }); Ext.Viewport.add(panel); panel.setActiveItem(0); // 默认激活第一个模块 }});
代码解析:
以上代码中,在容器内部建立了一个工具栏和四个屏的信息。工具栏自己使用了docked属性,停靠于容器的顶部,因此不当作card处理。后面四个子元素模块被视为card,按照定义时的顺序保存于一个数组里面,通过父容器的setActiveItem(index)方法来激活显示的模块信息。而toolbar中,每个按钮的点击事件的处理中都调用激活相应模块的方法。运行上面代码体验一下效果。
Fit(自适应方式)
Fit(自适应方式),很容易理解,它就是自动将父容器填满。如下图所示,
Fit
例如一个宽200px,高200px 大小的父容器,设置了layout方式是fit,并且只有一个子组件,那么该子组件也是宽200px高200px。该例子的实现可以参考以下代码:
var panel = Ext.create('Ext.Panel', { width: 200, height: 200, layout: 'fit', items: { xtype: 'panel', html: 'Also 200px by 200px' }});Ext.Viewport.add(panel);
Docking(停靠)
容器在使用各种布局方式时,都允许将子组件Docking(停靠)在容器里的top(上)、bottom(下)、left(左)、right(右)四条边上,而其它子组件也会根据需要调整大小。例如,我们修改一下第一个例子,代码如下:
Ext.create('Ext.Container', { fullscreen: true, layout: 'hbox', items: [ { docked: 'top', xtype: 'panel', height: 20, html: 'This is docked to the top' }, { xtype: 'panel', html: 'message list', flex: 1 }, { xtype: 'panel', html: 'message preview', flex: 2 } ]});
我们为其多添加了xtype为'panel',docked为'top'的panel作为子组件。这样,就在原来的例子的基础上,多出了一个停靠在顶部的panel。因为该panel也占据了一定的高度,而原来的两个panel的高度也将自动缩小。大概效果如下图所示。当然,你也可以运行一下上方代码查看效果。
docked: 'top'
现在,我们修改一下第二个例子,看看当docked为left的时候是什么效果:
Ext.create('Ext.Container', { fullscreen: true, layout: 'vbox', items: [ { docked: 'left', xtype: 'panel', width: 100, html: 'This is docked to the left' }, { xtype: 'panel', html: 'message list', flex: 1 }, { xtype: 'panel', html: 'message preview', flex: 2 } ]});
这次是docked:'left' 了,panel停靠容器内部的左边,占用了一定的宽度,因此,其它两个panel的宽度也自动收窄了。
docked: 'left'
以上就是Sencha Touch 2的几种布局方式。由于Sencha Touch 2是允许多层组件的嵌套,因此,我们也可以运用多种布局组合去完成我们页面排版。童孩们多做练习,看怎样布置你的app会更加美观、大方。
- Sencha Touch 2 快速入门系列(五)-- 布局(Layouts)
- Sencha Touch 2 快速入门系列(一)-- 建立第一个Sencha Touch应用
- Sencha Touch 2 快速入门系列(二)-- 组件(Components)
- Sencha Touch 2 快速入门系列--索引
- Sencha Touch 2 快速入门系列--索引
- sencha touch 入门系列 (五)sencha touch运行及代码解析(上)
- sencha touch 入门系列 (三)sencha touch 项目创建
- sencha touch 入门系列 (一)sencha touch 简介
- sencha touch 入门系列 (二)sencha touch 开发准备
- Sencha Touch 2 快速入门系列(六)-- 数据(Data)
- Sencha Touch 2 快速入门系列(七) -- 视图(View)
- Sencha Touch 2 快速入门系列(九) -- 配置(Profile)
- Sencha Touch 2 快速入门系列(八) -- 控制器(Controller)
- Sencha Touch 2 快速入门系列(八) -- 控制器(Controller)
- Sencha Touch 2 快速入门系列(六)-- 数据(Data)
- Sencha Touch 2 快速入门系列(三)-- 组件之表格(Forms)
- Sencha Touch 2 快速入门系列(四)-- 组件之标签面板(TabPanel)
- sencha touch 入门系列 (九) sencha touch 布局layout
- C语言I/O小结 poj百练2804字典(基础题)
- Linux程序设计——进程间通信:管道
- 资料保全与技术鉴定
- php中文乱码
- 如何使自己的程序只运行一次
- Sencha Touch 2 快速入门系列(五)-- 布局(Layouts)
- 备注
- Hibernate4 buildSessionFactory过时解决方案HibernateUtil
- 轮询
- ACE 开 发 环 境 构 建 笔 记
- Linux内核bridge中的数据包处理流程
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 (自我复制语句)
- Flex 字幕滚动效果 网站公告效果
- HttpClient, 使用C#操作Web