第五節:Flutter 中Container容器組件

1. Container組件的了解

關于container組件的介紹:

  1. Container是一個組合類的容器,本身并不對應具體的RenderObject
  2. Container是DecorationBox,Padding,Align,Align等一些組建的組合
  3. 因此可以通過Container組件實現同時需要裝飾,變換,限制等場景


1.1 Container源碼中的參數
Container({
    Key key,
    this.alignment,
    this.padding,       //容器內補白,屬于decoration的裝飾范圍
    this.color,         // 背景色
    this.decoration,    // 背景裝飾
    this.foregroundDecoration,  // 前景裝飾
    double width,            //容器的寬度
    double height,            //容器的高度
    BoxConstraints constraints,  //容器大小的限制條件
    this.margin,           //容器外補白,不屬于decoration的裝飾范圍
    this.transform,       //變換
    this.child,
    this.clipBehavior = Clip.none,
})


1.2 Container 容器組件常用參數
名稱 功能
alignment topCenter 頂部居中對齊<br />topLeft: 頂部左對齊<br />topRight: 頂部右對齊<br />center: 水平垂直居中對齊<br />centerLeft: 垂直居中,水平左對齊<br />centerRight: 垂直居中,水平右對齊<br />bottomCenter: 底部居中對齊<br />bottomLeft: 底部左對齊<br />bottomRight: 底部有對齊
decoration decoration: BoxDecoration(<br /> color: Colors.blue,<br /> border: Border.all(<br /> color: Colors.red,<br /> width: 2.0<br /> )<br /> BorderRadius.all(<br /> Radius.circular(8.0)<br /> )<br /> )
width 容器的寬度 double值
height 容器的高度 double值
margin margin 屬性表示Container與外部的其他組件的距離<br />EdgeInsets.all(20.0)
padding padding 就是Container的內邊距,指Container邊緣與child之間的距離<br />padding: EdgeInsets.all(10.0)
transform 讓Container容易進行一些轉換之類的
child 子組件


1.3 容器參數注意項
  1. 容器大小可以通過width,height指定,也可通過constraints指定
  2. 如果同時存在,width,height優先
  3. colordecoration是互斥的,同時存在會報錯
  4. 因為指定color時,Container內部會自動創建decoration


1.4 Container組件使用示例

在示例中,同時復習了一下Text組件所學內容

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Text(
                    "你好,Flutter",                           // 文本內容
                    // 關于Text組件參數的復習
                    style: TextStyle(
                        fontSize: 30.0,                       // 字體大小
                        height: 2,                            // 行高
                        color: Colors.white,                  // 文字顏色
                        fontWeight: FontWeight.bold,          // 文字粗體
                        fontStyle: FontStyle.italic,          // 文字斜體
                        letterSpacing: 6,                     // 字間距
                        decoration: TextDecoration.underline, // 下劃線

                    )
                ),
                width: 300,                         // 容器寬度
                height: 300,                        // 容器的高度
                // 容器的背景顏色color, 不能與decoration同時使用
                // color: Colors.blue,      
                padding: EdgeInsets.all(10),        // 容器的padding
                transform: Matrix4.rotationZ(0.1),  // X軸旋轉0.1弧度
                decoration: BoxDecoration(   //容器的描述
                    color: Colors.green,     // decoration中也有color,背景顏色
                )
            )
        );
    }
}

顯示結果

container容器組件_圖1.png

在Container組件的使用過程中,我們會發現很多屬性需要其他組件來修飾,

接下來,我們看看其他的組件信息


2. Padding 填充

Padding可以給其子節點添加填充(留白),也就是我們通常所說的內邊距

Container組件中的padding參數是有EdgeInsets類(組件)進行修飾


2.1 EdgeInsets

先看一下EdgeInsets修飾值的方法

  1. formLTRB(double left, double top, double right, double bottom)分別指定四個方向

  2. all(double value), 所有方向設置相同值的padding

  3. only({left ,top, right ,bottom}), 可以設置具體某個發方向的填充

  4. symmetric({vertical,horizontal}) 用于設置對稱方向的填充

    vertical 指的是top和bottom , horizontal 指的是left和right


2.2 示例代碼
class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Text(
                    "你好,Flutter",       // 文本內容
                    style: TextStyle(
                        fontSize: 30.0,     // 字體大小
                        color:Colors.white,
                        height: 2,          // 行高
                        letterSpacing: 6,   // 字間距
                    )
                ),
                width: 300,               // 容器寬度
                height: 300,              // 容器的高度
                
                // padding值設置的四種方法:
           
                // 1.all方法: 四個方向的padding都是10
                //padding: EdgeInsets.all(10), 
                
                // 2.fromLTRB: 左上右下paddin值為10,20,30,0
                //padding: EdgeInsets.fromLTRB(10,20,30,0), 
                
                 // 3.only: 值是可選參數, 只有left有20px的padding
                //padding: EdgeInsets.only(left: 20),   
                
                // 4.symmetric: 值是可選參數, 只有左右有30px的padding
                padding: EdgeInsets.symmetric(horizontal: 30), 
                
                
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景顏色
                )
            )
        );
    }
}

顯示結果:

padding填充_圖2.png


3. DecoratedBox 裝飾容器

DecoratedBox可以在其子組件繪制前(或后)繪制一些裝飾(Decoration),如背景、邊框、漸變等。DecoratedBox定義如下:

const DecoratedBox({
    Decoration decoration,
    DecorationPosition position = DecorationPosition.background,
    Widget child
})

decoration:代表將要繪制的裝飾,它的類型為DecorationDecoration是一個抽象類.

但是我們通常使用BoxDecoration,BoxDecorationDecoration的一個子類


3.1 BoxDecoration

BoxDecoration用來實現了常用的裝飾元素的繪制

參數

BoxDecoration({
    Color color,                         //顏色
    DecorationImage image,               //圖片
    BoxBorder border,                    //邊框
    BorderRadiusGeometry borderRadius,   //圓角
    List<BoxShadow> boxShadow,           //陰影,可以指定多個
    Gradient gradient,                   //漸變
    BlendMode backgroundBlendMode,       //背景混合模式
    BoxShape shape = BoxShape.rectangle, //形狀
})


3.2 示例代碼
Widget build(BuildContext content){
    return Center(
        child: Container(
            child: Text(
                "按鈕",       // 文本內容
                textAlign: TextAlign.center,
                style: TextStyle(
                    fontSize: 20.0,     // 字體大小
                    color:Colors.white,
                    height: 2,          // 行高
                    letterSpacing: 6,   // 字間距
                )
            ),
            width: 100,               // 容器寬度
            height: 50,              // 容器的高度

            decoration: BoxDecoration(
                // 背景漸變
                gradient: LinearGradient(colors:[Colors.red,Colors.orange[700]]), 
                borderRadius: BorderRadius.circular(10.0),  // 10像素圓角
            )
        )
    );
}
}

結果

裝飾容器_圖3.png


4. 變換 Transform

Transform可以在其子組件繪制時對其應用一些矩陣變換來實現一些特效。

Matrix4是一個4D矩陣,通過它我們可以實現各種矩陣操作,

至于矩陣變換,不是我們的重點, 矩陣是線性代數的概念,我們只需要了解Flutter中如何使用就OK了


4.1 變換示例:
class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Text(
                    "按鈕",       // 文本內容
                    textAlign: TextAlign.center,
                    style: TextStyle(
                        fontSize: 20.0,     // 字體大小
                        color:Colors.white,
                        height: 2,          // 行高
                        letterSpacing: 6,   // 字間距
                    )
                ),
                width: 100,               // 容器寬度
                height: 50,              // 容器的高度

                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景顏色
                ),
                // transform的變化
                
                // 變化位移
                //transform: Matrix4.translationValues(10, 100, 0),
                
                // 旋轉
                //transform: Matrix4.rotationZ(0.3),
                
                // 縮放
                transform: Matrix4.diagonal3Values(0.5, 1, 1) ,
            )
        );
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373