【Flutter】テキストの表示
Text
Text
は、単一スタイルのテキストを表示するのに使用します。
Text('はじめてのテキスト')
以下のプロパティによってテキストの位置やスタイルを設定します。
位置
テキストの位置はtextAlign
プロパティにTextAlign
を指定することで設定します。
Text(
'テキストの位置',
textAlign: TextAlign.center,
)
TextAlign.left
: 左寄せTextAlign.center
: 中央寄せTextAlign.right
: 右寄せ
スタイル
テキストの色や大きさなどのスタイルは、style
プロパティにTextStyle
を指定することで設定します。
Text(
'テキストのスタイル',
style: TextStyle(
backgroundColor: Colors.red,
color: Colors.white,
fontSize: 20,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
letterSpacing: 4.0,
),
テキストのスタイル
TextStyle
には以下のプロパティがあります。
一部のプロパティについては別途説明します。
プロパティ | 設定例 | 説明 |
---|---|---|
backgroundColor | Colors.red | 背景色 |
color | Colors.white | 文字色 |
fontSize | 20 | フォントサイズ |
fontStyle | FontStyle.italic | フォントスタイル(イタリック) |
fontWeight | FontWeight.bold | 文字の太さ |
height | 5 | 行の高さ` |
letterSpacing | 4 | 文字間隔 |
wordSpacing | 4 | 単語間隔 |
フォントサイズについては、style
プロパティとは別にtextScaleFactor
プロパティがあります。
こちらは倍率を指定することでフォントサイズを変化させます。
Text(
'フォントサイズの変更',
textScaleFactor: 2
)
decoration
decoration
プロパティでは、下線などの線をテキストに設定することができます。
また関連するdecorationColor
、decorationStyle
によって色と形状を変化させることができます。
Text(
'下線付きテキスト',
TextStyle(
decoration: TextDecoration.underline,
decorationColor: Colors.red,
decorationStyle: TextDecorationStyle.double
)
)
下線付きテキスト
TextDecoration
(線の位置)overline
: 上線lineThrough
: 取消線(中線)underline
: 下線
TextDecorationStyle
(線のスタイル)solid
: 単独線double
: 二重線dotted
: 点線dashed
: 破線wavy
: 波線
fontFamily
フォントの種類を変える場合は、Google Fontなどから使用したいフォントをダウンロードします。
ダウロードした zip ファイルを解凍すると、いくつかttf
ファイルがあるので、
これらのファイルをfonts
というフォルダを作成して配置します。
次にpubspec.yaml
を編集します。
以下のように配置したファイルと対応する文字の太さを割り当てます。
flutter:
fonts:
- family: M PLUS Rounded 1c
fonts:
- asset: fonts/MPLUSRounded1c-Regular.ttf
- asset: fonts/MPLUSRounded1c-Thin.ttf
weight: 100
- asset: fonts/MPLUSRounded1c-Light.ttf
weight: 300
- asset: fonts/MPLUSRounded1c-Medium.ttf
weight: 500
- asset: fonts/MPLUSRounded1c-Bold.ttf
weight: 700
- asset: fonts/MPLUSRounded1c-ExtraBold.ttf
weight: 800
- asset: fonts/MPLUSRounded1c-Black.ttf
weight: 900
イタリックなどのフォントスタイルがある場合はstyle: italic
を指定します。
テキストにフォントを適用する場合はfontFamily
プロパティを使用します。
Text(
'フォント指定',
fontFamily: 'M PLUS Rounded 1c'
)
折り返し
親の幅を超える文字数を設定する場合、デフォルトでは文字が折り返されます。
折り返しをしたくない場合はsoftWrap
プロパティにfalse
を設定します。
Text(
'折り返しをしたくない',
softWrap: false
)
■ 折り返しあり(デフォルト)
寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶら小路のぶら小路パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助
■ 折り返しなし
上記のプレビューを見ていただくとわかるように、文字が中途半端に切れてしまします。
これを解決するためにoverflow
プロパティを設定します。
overflow
プロパティには、TextOverflow
を指定します。
Text(
'末尾の処理を行う',
softWrap: false,
overflow: TextOverflow.ellipsis,
)
clip
: 幅いっぱいに文字を表示します。ellipsis
: 末尾を...
とすることで、幅内で文字を表示します。fade
:clip
と同じく幅いっぱいに文字を表示しますが、末尾が透過します。visible
: 幅に関係なく文字を表示します。
■ clip(デフォルト)
■ ellipsis
■ fade
■ visible
寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶら小路のぶら小路パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助
softWrap
プロパティでは文字が 1 行になってしましますが、maxLines
プロパティを指定することで表示する最大の行数を設定することができます。
Text(
'2行表示する',
maxLines: 2,
overflow: TextOverflow.ellipsis,
)
RichText
RichText
は、TextSpan
と組み合わせることにより、テキストの一部のスタイルを変更することができます。
RichText(
text: TextSpan(
style: TextStyle(
color: Colors.blue,
),
children: <TextSpan>[
TextSpan(
text: 'はじめての',
),
TextSpan(
text: 'RichText',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.red,
),
),
TextSpan(
text: 'です',
),
],
),
)
はじめての RichText です
テキストの位置を設定するtextAlign
や、折り返しを設定するsoftWrap
やmaxLines
は、RichText
のプロパティとして設定します。
TextSpan
TextSpan
についてもう少しだけ深掘りします。
上例でも分かるように、部分的にテキストのスタイルを変化させたい場合は、TextSpan
のchildren
に複数のTextSpan
を設定することで実現します。
text
プロパティに表示するテキストを設定し、style
プロパティでスタイルを設定します。
その他のプロパティとして、recognizer
があります。
recognizer
には、テキストをタップするなどのジェスチャーに対する処理を設定します。
例えばタップした時の処理は、TapGestureRecognizer()
を使用します。
以下の場合、タップするとコンソールにTap Text!!
と表示されます。
RichText(
text: TextSpan(
text: 'タップしてください',
recognizer: TapGestureRecognizer()
..onTap = () => print("Tap Text!!"),
),
)
その他に、ダブルタップした時の処理としてDoubleTapGestureRecognizer()
や、長押しした場合の処理としてLongPressGestureRecognizer()
などがあります。
RichText(
text: TextSpan(
text: 'ダブルタップしてください',
recognizer: DoubleTapGestureRecognizer()
..onDoubleTap = () => print("Double Tap Text!!"),
),
)
RichText(
text: TextSpan(
text: '長押ししてください',
recognizer: LongPressGestureRecognizer(
duration: Duration(seconds: 5),
)..onLongPress = () => print("Long Press Text!!"),
),
)
LongPressGestureRecognizer
は、duration
プロパティを設定することで何秒間押し続けたら実行するという設定ができます。
Text.rich
実は、TextRich
はText.rich
で代用することができます。
Text.rich(
TextSpan(
style: TextStyle(
color: Colors.blue,
),
children: <TextSpan>[
TextSpan(
text: 'はじめての',
),
TextSpan(
text: 'RichText',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.red,
),
),
TextSpan(
text: 'です',
),
],
),
)
大きく変わりはありませんが、text
プロパティが不要な分、Text.rich
の方が使いやすい気がします。
DefaultTextStyle
DefaultTextStyle
は、すべての子以下のウィジェットのテキストスタイルを設定するために使用します。
DefaultTextStyle(
style: TextStyle(
color: Colors.red,
fontSize: 20,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text('A'),
Text('B'),
Text('C'),
],
),
)
A
B
C
DefaultTextStyle
は入れ子にする場合、そのまま設定すると先に設定したスタイルが適用されなくなります。
DefaultTextStyle(
style: TextStyle(
color: Colors.red,
fontSize: 20,
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
DefaultTextStyle(
style: TextStyle(
backgroundColor: Colors.blue,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
],
),
)
A
B
C
A
B
C
A
B
C
先に設定しているスタイルも適用したい場合は、merge()
を使用します。
DefaultTextStyle(
style: TextStyle(
color: Colors.red,
fontSize: 20,
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
DefaultTextStyle.merge( //←
style: TextStyle(
backgroundColor: Colors.blue,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [Text("A"), Text("B"), Text("C")],
),
],
),
)
A
B
C
A
B
C
A
B
C