Flutter小課堂開課了,今天的主角是Text,文字和圖片幾乎統治了我們的整個視覺世界
今天將帶你瞭解一下Flutter中Text的一些屬性及用法
1.簡單使用
可以通過工具欄開啟,顯示文字基線
var container=Container(
color: Color(0x6623ffff),
width: 200,
height: 200*0.618,
child: text,
);
var text=Text("toly-張風捷特烈-1994`");
複製程式碼
2.Text的style屬性
2.1:常用屬性
style對應的是TextStyle物件,常用的幾個屬性如下
var style = TextStyle(
color: Colors.red, //顏色
backgroundColor: Colors.white,//背景色
fontSize: 20,//字號
fontWeight: FontWeight.bold,//字粗
fontStyle: FontStyle.italic,//斜體
letterSpacing: 10,//字間距
);
var text = Text("toly-張風捷特烈-1994`",style: style,);
複製程式碼
可見文字到了容器的邊上會自動換行。
2.2:字型的修改:fontFamily屬性
如何引用外來字型
var style = TextStyle(
color: Colors.red, //顏色
backgroundColor: Colors.white,//背景色
fontFamily:"阿里惠普體"
);
var text = Text("toly-張風捷特烈-1994`",style: style,);
複製程式碼
2.3:文字陰影:shadows屬性
一開始看到shadows是一個
List<ui.Shadow>
感覺這巢狀的有點深啊
Shadow又是個沒見過的類,並存在Flutter要啥給啥,沒啥造啥
的世界真理,造一個物件唄,反正不花錢。
var shadow = Shadow(
color: Colors.black, //顏色
blurRadius: 1, //虛化
offset: Offset(2, 2)//偏移
);
var style = TextStyle(
color: Colors.grey, //顏色
fontSize: 100, //字號
shadows: [shadow]);
var text = Text(
"張風捷特烈",
style: style,
);
複製程式碼
多陰影
感覺有點奇怪,為什麼是個List,那就搞條彩虹試試唄
const rainbow = [
0xffff0000,
0xffFF7F00,
0xffFFFF00,
0xff00FF00,
0xff00FFFF,
0xff0000FF,
0xff8B00FF
];
shadows() {
var shadows = <Shadow>[];
for (int i = 0; i < rainbow.length; i++) {
shadows.add(Shadow(
color: Color(rainbow[i]),
blurRadius: i * 2.5,
offset: Offset(-(1 + i) * 3.0, -(1 + i) * 3.0)));
}
return shadows;
}
var style = TextStyle(
color: Colors.black, //顏色
fontSize: 100, //字號
shadows: shadows());
var text = Text(
"張風捷特烈",
style: style,
);
複製程式碼
2.4:裝飾線:decoration屬性
對應的物件型別是TextDecoration,擁有四個靜態常量,表現如下
var style = TextStyle(
color: Colors.black, //顏色
fontSize: 20, //字號
decoration: TextDecoration.lineThrough);
var text = Text(
"張風捷特烈",
style: style,
);
複製程式碼
2.5:裝飾線樣式: decorationStyle屬性
所對應的型別為TextDecoration列舉,一共五種,如下:
var style = TextStyle(
color: Colors.black, //顏色
fontSize: 20, //字號
// shadows: shadows()
decoration: TextDecoration.lineThrough,
decorationColor: Color(0xffff0000),//裝飾線顏色
decorationStyle: TextDecorationStyle.wavy,
decorationThickness: 0.8,//裝飾線粗
);
var text = Text(
"張風捷特烈",
style: style,
);
複製程式碼
3.Text的其他屬性
3.1:textAlign和textDirection
textDirection對應型別,TextDirection。包括兩個列舉:ltr(左到右)和rtl(右到左)
textAlign在textDirection不同時有不同表現,如下圖:
Text(
"張風捷特烈-toly-1994-9999999999999999",
textAlign: TextAlign.justify,
textDirection: TextDirection.ltr,
style: TextStyle(
color: Colors.black, //顏色
fontSize: 14, //字號
),
)
複製程式碼
TextDirection:extDirection.ltr時textAlign的表現
TextDirection:extDirection.rtl時textAlign的表現
3.2:strutStyle屬性
strutStyle對應類是StrutStyle,這個類是一個單獨的檔案,感覺應該挺重要
不過這個類看得不是非常懂,貌似是使用一個字型的骨架,但不用這個字型。
可以看出不同字型的基線是不同的,如果多種字型同時出現,未免會造成差別
使用統一的strutStyle可以讓基線統一的同時又能保持字型的不同,大概就這個意思吧
var text =Text(
"張風捷特烈-toly-1994-9999999999999999",
strutStyle: StrutStyle(
fontFamily: '阿里惠普體',
fontSize: 24,
forceStrutHeight: true,
),
style: TextStyle(
color: Colors.black, //顏色
fontSize: 24, //字號
fontFamily: "阿里惠普體"
),
);
複製程式碼
3.3:softWrap和overflow屬性
對應TextOverflow列舉物件,一共四枚,情況如下:
softWrap決定是否會自動換行
Text(
"張風捷特烈-toly-1994-99999999999999999999",
overflow: TextOverflow.clip,
softWrap: false,
style: TextStyle(
color: Colors.black, //顏色
fontSize: 24, //字號
),
)
複製程式碼
softWrap為true(預設)時
softWrap為false時
3.4:textScaleFactor和maxLines屬性
maxLines 不用多說,顯示的最大行數,textScaleFactor可以實現文字的縮放
var text =Text(
"張風捷特烈-toly-1994-9999999999999999",
textScaleFactor: 0.5,
maxLines: 2,//最多2行
style: TextStyle(
color: Colors.black, //顏色
fontSize: 12, //字號
),
);
複製程式碼
好了,Text基本上就是這樣,別忙走,還有的TextSpan呢
4.TextSpan
首先它不是一個Widget,其次它可以作為
Text.rich()
的入參
TextSpan的強大之處在於你可以在一行文字中使用很多樣式,甚至新增別的控制元件
4.1:TextSpan原始碼中的示例
看原始碼時,原始碼中給了一個小例子蠻好的,這裡講一下
可以看出,一行文字中可以有多種樣式,這就是TextSpan的基本用法
var span=TextSpan(
text: 'Hello', // default text style
children: <TextSpan>[
TextSpan(text: ' beautiful ', style: TextStyle(fontStyle: FontStyle.italic)),
TextSpan(text: 'world', style: TextStyle(fontWeight: FontWeight.bold)),
],
);
return Text.rich(
span,
);
複製程式碼
4.2:彩虹字
既然如此,自己動手,來寫個彩虹字吧
const rainbowMap = {
0xffff0000:"紅色",
0xffFF7F00:"橙色",
0xffFFFF00:"黃色",
0xff00FF00:"綠色",
0xff00FFFF:"青色",
0xff0000FF:"藍色",
0xff8B00FF:"紫色",
};
var spans= <TextSpan>[];
rainbowMap.forEach((k,v){
spans.add(TextSpan(
text: v+" ",
style: TextStyle(fontSize: 20.0, color: Color(k))),);
});
var show = Text.rich(TextSpan(
text: '七彩字:\n',
style: TextStyle(fontSize: 16.0, color: Colors.black),
children: spans));
複製程式碼
4.3:炫彩文章
既然如此,那就再玩玩唄,將一片文章變得多彩。這裡匆匆的文章就不貼了
colorfulText(String str,{double fontSize=14}) {
var spans= <TextSpan>[];
for(var i=0;i<str.length;i++){
spans.add(TextSpan(
text: str[i],
style: TextStyle(fontSize: fontSize, color: randomRGB())),);
}
return Text.rich(TextSpan(
children: spans));
}
///簡單隨機色
///
Color randomRGB() {
Random random = Random();
int r = 30 + random.nextInt(200);
int g = 30 + random.nextInt(200);
int b = 30 + random.nextInt(200);
return Color.fromARGB(255, r, g, b);
}
var show = colorfulText(cc,fontSize: 20);
複製程式碼
如果你想,做成開始那張圖,文字隨機大小也可以,反正TextSpan就是這麼強大。
本文到此接近尾聲了,如果想快速嚐鮮Flutter,《Flutter七日》會是你的必備佳品;如果想細細探究它,那就跟隨我的腳步,完成一次Flutter之旅。
另外本人有一個Flutter微信交流群,歡迎小夥伴加入,共同探討Flutter的問題,本人微訊號:zdl1994328
,期待與你的交流與切磋。