Sencha touch 開發系列:組件佈局

你如果對ST的組件有了一些認識後,然後你又想做一些東東來體驗下ST。拿到設計圖後,那麼你就需要好好的規劃你的應用,需要哪些組件,各組件都應該擺放在哪裏?

這個時候你就需要了解一下ST裏面的佈局(layout)

同樣,打開我們的API文當http://docs.sencha.com/touch/2-0/#!/api

找到layout,並展開,

我們可以看到ST爲我們提供了:vbox,hbox,card,fit

有人肯定會問還有abstractBox,和default

abstractBox(抽象盒子)是vbox和hbox的父類,是default的子類,

default(默認)提所有佈局的基類,一般不需要提交

所以常用的只有vbox,hbox,card,fit

我在此特別聲明一下:所有的佈局方式都是應用於(容器的)子組件的擺放上面,比如:一個廚房,廚房裏面很多東西,如何擺放你必須告訴廚房,而不是告訴桌子或凳子。

下面我們就一一介紹下嘍!

vbox:垂直襬放盒子

hobx:水平擺放盒子

card:卡片式存放

fit:填充式存放

先從字面意思上去理解一下

vbox:

就是將容器內部的所有項(item),垂直方式擺放。

看圖:

代碼:

//在一個全屏的容器中,我們放了四個子項,第一項佔了一份
Ext.create('Ext.Container', {
    fullscreen:true,  
    layout: 'vbox',
    items: [
        {
            //第一項,佔了四份中的一份
            html: "First Item",
            style:'background:red',
            flex:1,
        },
        {
            //第二項,佔了四份中的一份
            html: "Second Item",
            style:'background:yellow',
            flex:1,
        },
        {
            //第三項,佔了四份中的一份
            html: "Third Item",
            style:'background:blue',
            flex:1,
        },
        {
            //第四項,佔了四份中的一份
            html: "Fourth Item",
            style:'background:green',
            flex:1,
        }
    ]
});

看代碼備註。

我們在一個全屏的容器,放了四個item,我們又採用了vbox,意味着,我們將需要把這些項垂直襬放。

有人會問了,那如何去確定某一項佔多少位置(高度)呢?

恩,我們確實需要告訴這個容器,各子項需要多少位置才能放得下,在這我們應用了flex(份數),通過flex去請求容器給它對應的空間。

容器在這種佈局會彙總所有子項的flex總數。然後平分,在這我們flex總數是4,那就意味着,我們這個全容器將分成4分,每個子項的flex都是1,說明他們都只點了一份了(平均分配了!)

在圖上,你可以看出,他們的高度都相等的哦。

你可以把上面的代碼複製到我們的code editor中去查看他的效果,然後改變各項的 flex去體驗容器是怎麼分配空間的。

又有人會問了,flex無法確定我的實際高度?

恩,確實,這裏我們還有一個利器 height,我們可以通過設定某一個子項的height告訴容器它需要審請多少高度。

如:

//在一個全屏的容器中,我們放了四個子項,第一項佔了150的高度,然後將容器的剩餘高度分成了三份,每項佔一份
Ext.create('Ext.Container', {
    fullscreen:true,  
    layout: 'vbox',
    items: [
        {
            //第一項,佔了150px的高度
            html: "First Item",
            style:'background:red',
            height:150,
        },
        {
            //第二項,佔了三份中的一份
            html: "Second Item",
            style:'background:yellow',
            flex:1,
        },
        {
            //第三項,佔了三份中的一份
            html: "Third Item",
            style:'background:blue',
            flex:1,
        },
        {
            //第四項,佔了三份中的一份
            html: "Fourth Item",
            style:'background:green',
            flex:1,
        }
    ]
});

效果:

注意看代碼備註,或許已經明白了?

vbox是作於垂直方向的,用來分配窗器高度的。

那麼hobx就很明顯了,他是平分容器寬度的。

我們把上述代碼的layout改爲hbox,看看效果。

代碼:

//在一個全屏的容器中,我們放了四個子項,第一項佔了150的寬度,然後將容器的剩餘高度分成了三份,每項佔一份
Ext.create('Ext.Container', {
    fullscreen:true,  
    layout: 'hbox',
    items: [
        {
            //第一項,佔了150px的高度
            html: "First Item",
            style:'background:red',
            width:150,
            
        },
        {
            //第二項,佔了三份中的一份
            html: "Second Item",
            style:'background:yellow',
            flex:1,
        },
        {
            //第三項,佔了三份中的一份
            html: "Third Item",
            style:'background:blue',
            flex:1,
        },
        {
            //第四項,佔了三份中的一份
            html: "Fourth Item",
            style:'background:green',
            flex:1,
        }
    ]
});

同樣看備註,你或許能夠明白了vbox和hbox的區別與作用了?不明白的,速度加入我們的社區或羣:13453484

下面我們一搞個vbox和hbox結合的例子

代碼:

//在一個全屏的容器中,我們放了四個子項,將容器的剩餘高度分成了四份,每項佔一份
Ext.create('Ext.Container', {
    fullscreen:true,  
    layout: 'vbox',
    items: [
        {
            //第一項,佔了四份中的一份     
            style:'background:red',
            flex:1,
            layout:'hbox',
            items:[{html:'hbox的子項一',flex:1, style:'background:white'},{html:'hbox的子項二',flex:1, style:'background:gray',}]
            
        },
        {
            //第二項,佔了四份中的一份
            html: "Second Item",
            style:'background:yellow',
            flex:1,
        },
        {
            //第三項,佔了四份中的一份
            html: "Third Item",
            style:'background:blue',
            flex:1,
        },
        {
            //第四項,佔了四份中的一份
            html: "Fourth Item",
            style:'background:green',
            flex:1,
        }
    ]
});

效果:

至此,你會用了沒,理解了沒?不會的,不理解的,就code editor裏面多多練習,多多體會哈。這很重要哦......

 

下面,我們來講fit,card。

fit是用來將子項整個填充至容器中,意思就是窗口有多子,那麼他下面的子項就有多大了。

用實例說話:

//創建一個300*200的容器,裏面放了一個子項,並指定這個容器的layout爲fit佈局
var container= Ext.create('Ext.Container', {
    width: 300,
    height: 200,
    layout: 'fit',
    items: {
        xtype: 'panel',
        html: '我也將是300*200的大小',
        style:'background:red'
    }
});
 
//將container添加到我們的St應用的頂層容器中,Ext.Viewport是一個全局容器,無需定義,它指向的是你應用的最頂層。
Ext.Viewport.add(container);

效果:

那麼card佈局是怎樣的呢,他其實和fit相似,只是他可以有多層,就像卡放一樣疊起來放在容器中。

照樣用實例說話:

//創建一個全屏的容器,在裏面放了四項,容器的layout爲card
var container= Ext.create('Ext.Container', {
    layout: 'card',
    fullscreen:true,
    items: [
        {
            html: "First Item"
        },
        {
            html: "Second Item"
        },
        {
            html: "Third Item",<br>            style:'background:red',<br>
        },
        {
            html: "Fourth Item"
        }
    ]
});
//默認我們會顯示第一項,因採用card佈局,我們可以指定將第三項顯示出來(下標從0開始)
container.setActiveItem(2);

效果:

//看備註,明白了麼?很簡單,card佈局內的東西就是把它一層層堆在裏面,要顯示哪一層的時候,只需要調用容器的setActiveItem  

card在一次顯示上,只會顯示一個子項,而其它的子項將是不可見的。

就上面的例子,我們把layout的card改爲fit

你再看效果:

即便是我們調和了setActiveItem容器也是把四個項都顯示出來的,很亂?

現在明白fit和card的區別了吧

如果容器中只一項,且需要填充顯示的時候你可以用fit,如果有多項且需要分層靈活顯示,那麼你就需要用card了。

至此,我們的佈局全部講完了,學習還得靠自己哈,多多練習,就在我們的code editor裏面,每種佈局你都需要玩熟哦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章