Flutter 12: 圖解圓形與權(quán)重/比例小嘗試

??????小菜今天搭建了一個很丑的【簽到】小頁面栖忠,頁面很簡單裁蚁,只有寥寥幾個控件卵史,但小菜想通過這個簡單的小頁面學(xué)習(xí)一下權(quán)重/比例的使用方式贡避,順便也學(xué)習(xí)了一下如何繪制圓形效果痛黎。

繪制圓形

??????小菜為了頁面稍微美觀一點予弧,準備用圓形來替換普通的按鈕,小菜發(fā)現(xiàn) Flutter 提供了很多便捷的繪制圓形的方式湖饱,比 Android 要方便很多桌肴。小菜測試時用到了如下兩種:

ClipOval

??????ClipOval 是一個很強大的裁剪子控件為橢圓或圓角的控件;子控件沒有特殊限制琉历。同時衍生出其他幾種裁剪方式:

  1. CustomClipper:可以創(chuàng)建自定義裁剪方式;
  2. ClipRect:可以裁剪不同寬高比例水醋,通過 heightFactor 屬性來處理旗笔;
  3. ClipRRect:可以設(shè)置圓角矩形或圓形;
  4. ClipPath:可以為任意形狀的裁剪方式拄踪;
new ClipOval(
   child: new SizedBox(
      width: 100.0,
      height: 100.0,
      // 子控件為網(wǎng)絡(luò)圖片
      child: new Image.network(
         "https://...pic.jpg",
         fit: BoxFit.fill,
      ),
      // 子控件為 Container
//     child: new Container( color: Colors.redAccent, ),
   ),
),
// 圓角矩形
new ClipRRect(
  borderRadius: const BorderRadius.all(const Radius.circular(30.0)),
  child: new Container(
    width: 90.0,
    height: 90.0,
    color: Colors.red,
  ),
),),
// heightFactor 為高/寬比例
new ClipRect(
  child: new Align(
    alignment: Alignment.topCenter,
    heightFactor: 1.0,
    child: new Container(color: Colors.yellow,height:90.0,width: 90.0,),
  ),
)
CircleAvatar

??????小菜以為 CircleAvatar 是繪制正圓最方便的方式蝇恶,Flutter 直接提供的繪制圓形的控件,可添加背景色及背景圖惶桐;且在加載網(wǎng)絡(luò)圖片時撮弧,網(wǎng)絡(luò)狀態(tài)不佳或圖片有問題時只顯示背景色,更人性化姚糊。

// 只有背景色
new CircleAvatar(
  backgroundColor: Colors.greenAccent,
  radius: 90.0,
),
// 添加背景圖
new Align(
   alignment: Alignment.center,
   child: new CircleAvatar(
      backgroundImage: new NetworkImage("https://...pic.jpg"),
      backgroundColor: Colors.greenAccent,
      radius: 90.0,
   ),
),

權(quán)重/比例

??????小菜在 Android 開發(fā)過程中為了適配不同機型贿衍,常用到權(quán)重 android:weight,這樣在均分布局時起到重要作用救恨;小菜尚在 Flutter 中沒有直接發(fā)現(xiàn) weight 的身影贸辈,Flutter 常用 RowColumn 來設(shè)置橫向和縱向布局。小菜發(fā)現(xiàn)可以通過如下方式來處理權(quán)重/比例肠槽。

Flexible

??????Flexible 默認也是讓子控件占滿填充整個父類布局擎淤,Flexible 中的 flex 屬性可以調(diào)整,若兩個 Flexible 控件 A/B秸仙,A 中 flex 設(shè)為 2嘴拢,B 中 flex 設(shè)為 1,則整個布局中 A:B=2:1 整體占滿整個布局寂纪。

new Row(
  children: <Widget>[
    new Flexible(
      child: new Container(
        color: Colors.redAccent,
        height: 40.0,
      ),
      flex: 1,
    ),
    new Flexible(
      child: new Container(
        color: Colors.blueAccent,
        height: 40.0,
      ),
      flex: 2,
    ),
  ],
),
Expanded

??????Expanded 默認讓子控件占滿填充整個父類布局席吴,Expanded 中的 flex 屬性為1,而 Expanded 繼承的是 Flexible弊攘;Flexible 支持的分割布局權(quán)重的方式 Expanded 也一樣抢腐,而與 Flexible 不同的是默認會將子控件充滿布局。

new Row(
  children: <Widget>[
    new Expanded(
      child: new Container(
        color: Colors.redAccent,
        height: 40.0,
      ),
      flex: 2,
    ),
    new Expanded(
      child: new Container(
        color: Colors.blueAccent,
        height: 40.0,
      ),
      flex: 1,
    ),
  ],
),

??????無論時 Expanded 還是 Flexible 小菜都建議依靠 RowColumn 共同使用襟交。小菜測試迈倍,兩者一起使用也不會太大影響。

主要源碼

class ItemSignPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new Column(
        children: <Widget>[
          new Container(
            height: 10.0,
          ),
          new Flexible(
            child: new Container(
              child: new Row(children: <Widget>[
                new Flexible(
                  child: new Container(),
                  flex: 1,
                ),
                new Container(
                  width: 16.0,
                  height: 1.0,
                ),
                new Container(
                  width: 1.0,
                  color: Colors.blueAccent,
                ),
                new Container(
                  width: 16.0,
                  height: 1.0,
                  color: Colors.blueAccent,
                ),
                new Flexible(
                  child: new Container(
                    child: buildListData(
                        context, Color.fromARGB(40, 50, 40, 80), '上班簽到'),
                  ),
                  flex: 1,
                ),
              ]),
            ),
            flex: 1,
          ),
          new Flexible(
            child: new Container(
              child: new Row(children: <Widget>[
                new Flexible(
                  child: new Container(
                    child: buildListData(context, Colors.greenAccent, '下班簽退'),
                  ),
                  flex: 1,
                ),
                new Container(
                  width: 16.0,
                  height: 1.0,
                  color: Colors.blueAccent,
                ),
                new Container(
                  width: 1.0,
                  color: Colors.blueAccent,
                ),
                new Container(
                  width: 16.0,
                  height: 1.0,
                ),
                new Flexible(
                  child: new Container(),
                  flex: 1,
                ),
              ]),
            ),
            flex: 1,
          ),
          new Container(
            height: 60.0,
            child: new Center(
              child: new Text(
                '請及時簽到哦~',
                style: new TextStyle(color: Colors.blue, fontSize: 16.0),
              ),
            ),
          ),
        ],
      ),
    );
  }

  Widget buildListData(BuildContext context, Color color, String text) {
    return new Center(
      child: new GestureDetector(
        child: new CircleAvatar(
          backgroundColor: color,
          radius: 72.0,
          child: new Text(
            text,
            style: new TextStyle(color: Colors.blue, fontSize: 18.0),
          ),
        ),
        onTap: () {
          showDialog(
            context: context,
            builder: (BuildContext context) {
              return new AlertDialog(
                title: new Text(
                  '溫馨提示',
                  style: new TextStyle(
                    color: Colors.black54,
                    fontSize: 18.0,
                  ),
                ),
                content: new Text('您點擊的item內(nèi)容為:$text'),
              );
            },
          );
        },
      ),
    );
  }
}

??????小菜剛接觸 Flutter 時間不長捣域,還有很多不清楚和不理解的地方啼染,如果又不對的地方還希望多多指出宴合。

來源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迹鹅,隨后出現(xiàn)的幾起案子卦洽,更是在濱河造成了極大的恐慌,老刑警劉巖斜棚,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阀蒂,死亡現(xiàn)場離奇詭異,居然都是意外死亡弟蚀,警方通過查閱死者的電腦和手機蚤霞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來义钉,“玉大人昧绣,你說我怎么就攤上這事〈氛ⅲ” “怎么了夜畴?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長删壮。 經(jīng)常有香客問我贪绘,道長,這世上最難降的妖魔是什么醉锅? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任兔簇,我火速辦了婚禮,結(jié)果婚禮上硬耍,老公的妹妹穿的比我還像新娘垄琐。我一直安慰自己,他們只是感情好经柴,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布狸窘。 她就那樣靜靜地躺著,像睡著了一般坯认。 火紅的嫁衣襯著肌膚如雪翻擒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天牛哺,我揣著相機與錄音陋气,去河邊找鬼。 笑死引润,一個胖子當著我的面吹牛巩趁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淳附,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼议慰,長吁一口氣:“原來是場噩夢啊……” “哼蠢古!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起别凹,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤草讶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炉菲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堕战,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年拍霜,在試婚紗的時候發(fā)現(xiàn)自己被綠了践啄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡沉御,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昭灵,到底是詐尸還是另有隱情吠裆,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布烂完,位于F島的核電站试疙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抠蚣。R本人自食惡果不足惜祝旷,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘶窄。 院中可真熱鬧怀跛,春花似錦、人聲如沸柄冲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽现横。三九已至漓拾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戒祠,已是汗流浹背骇两。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姜盈,地道東北人低千。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像贩据,于是被迫代替她去往敵國和親栋操。 傳聞我的和親對象是個殘疾皇子闸餐,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容