Flutter製のアプリでは、たびたび使用される上のようなグルグルの事です。
ローディングなどの待ち時間に表示することが多いですが、ダウンロードの進捗状況を表したり、タイマーに使用したりなど、
色やアニメーションを変えることでさまざまなカスタマイズができます。
今回は知っておくとよいCircularProgressIndicator
のカスタマイズ方法をまとめてご紹介します。
(Flutter ver.2.2です)
これはとてもシンプルです。
以下のようにSizedBox
で括ってheight
,width
を指定してやるだけでOK!
SizedBox(
height: 50, //指定
width: 50, //指定
child: CircularProgressIndicator(),
)
これもとてもシンプルです。
プロパティの一つであるstrokeWidth
を指定してやりましょう。
デフォルトでは、4.0になっているので、8.0に変えてみましょう。
SizedBox(
height: 50,
width: 50,
child: CircularProgressIndicator(strokeWidth: 8.0),
)
太さを変更すると以下の画像のような感じになります。
色の変え方は以下の2パターンあります。
CircularProgressIndicator
の色はデフォルトで青色になっています。
そこで以下のように、Flutterのテーマ内のprimarySwatch
にカラーを指定してやることで色を変更できます。
Theme(
data: ThemeData(primarySwatch: Colors.purple),
child: const CircularProgressIndicator(),
)
この例では、以下の画像のように紫色にしてみました。
CircularProgressIndicator
のプロパティの1つにvalueColor
というものがあります。
ここで色を指定してやることで、色を変更できます。
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(Colors.yellow),
)
AlwaysStoppedAnimation
という型で指定するので、少し特殊ですが。
変更後の色は以下の通りです(黄色)
今まで示した例では、色がついている部分以外は白色になっていました。
したがって、画面の白い背景と重なって見えなくなっていたわけです。
しかし、背景色を指定してやれば色(今回は緑)がついていない部分にも色を持たせることができます。
それでは、背景色を黒色Colors.black
にしてみましょう。
backgroundColor
を指定してやります。
CircularProgressIndicator(backgroundColor: Colors.black)
すると以下のようになります。
普段は勝手にぐるぐると回っていますが、このアニメーションをカスタマイズすることもできます。
5秒かけて、ぐるっと一周するアニメーションを作ってみましょう。
コードは以下の通りです。
TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: 1),
duration: const Duration(milliseconds: 5000),
builder: (context, value, _) =>
CircularProgressIndicator(value: value),
)
Duration
で秒数を指定し、Tween
内のbegin
,end
で色の占める割合を決定します。
この例では、0(緑色の部分が0%)から始まり、1(緑の部分が100%)で終わります。
動きはこんな感じです。
アニメーションがあるものがよく使われるイメージですが、静的なCircularProgressIndicator
も作ることができます。
最も簡単な例を示します。
静的で色が占める割合が50%のものは以下のようなコードで作成できます。
CircularProgressIndicator(value: 0.5)
value = 0.5
を指定するだけです。
value
を指定すると静的になります。(valueの値に応じて表示が変更できる)
value
をうまく使えば、タイマーなどに応用可能です。
時計であれば、60秒・60分で一周しますね。
ここでは10秒で1周するタイマーのようなものを作ってみます。
上記のアニメーションのカスタマイズとの相違点は、「10秒で1周する」ことを繰り返す点
です。
以下のようになります。
こちらは今まで紹介したものより少し複雑なので、全コードを載せます。
import 'dart:async';
import 'package:flutter/material.dart';
class CircularProgressIndicatorDemo extends StatefulWidget {
_CircularProgressIndicatorDemoState createState() =>
_CircularProgressIndicatorDemoState();
}
class _CircularProgressIndicatorDemoState
extends State<CircularProgressIndicatorDemo> {
Timer? _timer;
int _second = 0;
void initState() {
_timer = Timer.periodic(const Duration(seconds: 1), (timer) async {
setState(() {
_second = DateTime.now().second;
});
});
super.initState();
}
void dispose() {
_timer?.cancel();
super.dispose();
}
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: SizedBox(
height: 50,
width: 50,
child: CircularProgressIndicator(value: _value()),
),
),
);
}
double _value() {
return (_second % 10) / 10;
}
}
コードを軽く解説します。
_second
の値には、現在時刻の秒数を指定しています。
_timer = Timer.periodic(const Duration(seconds: 1), (timer) async {
setState(() {
_second = DateTime.now().second;
});
});
_second % 10
は現在の秒数を10で割った余りです。
なので、0から9のどれかになります。
したがって、_value()
の値は0、0.1,0.2 ....0.9と1秒ごとに変化します。
double _value() {
return (_second % 10) / 10;
}
最後に上記の_value()
をCircularProgressIndicator
のvalue
に入れてやれば完成です!
CircularProgressIndicator(value: _value())
いかがでしたでしょうか。
FlutterのCircularProgressIndicator
の使い方はマスターできましたか?
この記事の内容を応用すれば、ほぼ全カスタマイズを網羅できると思います。
参考にしていただけたら幸いです。
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More