SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Flutterで始めるモバイルアプリ開発

FlutterのCanvasを使ってみよう! 基本的な使い方から簡単なチャート作成まで解説

Flutterで始めるモバイルアプリ開発 第27回

チャートを作ってみる

 ここまでで基本的なCanvasの使い方は分かったと思うので、ここからはより具体的な例として、折れ線チャートを作成してみます。

折れ線チャートを作成する

 図7のような折れ線チャートを記述する場合の例を紹介します。

図7:CanvasでのLineChartの作成例
図7:CanvasでのLineChartの作成例

 リスト5がサンプルコードです。

[リスト5]ラインチャートのコード例(lib/screen/LineChartScreen.dartの一部抜粋)
class LineChartPainter extends CustomPainter{

  @override
  void paint(Canvas canvas, Size size) {

    // (1)Gridを記述するために変更
    canvas.save();
    canvas.translate(20, size.height - 20);
    canvas.scale(1, -1);

    //  (2)軸を記述する
    //  Grid線を記述する
    for(double i = 0.0; i < size.width - 40; i = i + 20.0) {
      canvas.drawLine(Offset(i,0), Offset(i,size.height - 40) , paint1);
    }
    for(double i = 0.0; i < size.height - 40; i += 20.0){
      canvas.drawLine(Offset(0,i), Offset(size.width - 40,i) , paint1);
    }

    // (省略)
    canvas.drawLine(const Offset(0,0),Offset(size.width - 40,0),paint2);
    canvas.drawLine(const Offset(0,0),Offset(0,size.height - 40),paint2);

    // (3)線を指定
    Paint paint3 = Paint()
          ..color = Colors.red
          ..style = PaintingStyle.stroke
          ..strokeWidth = 2
          ..strokeCap = StrokeCap.square;

    // (4)折れ線を記述
    Path path = Path()
      ..moveTo(0.0, 0.0)
      ..lineTo(80.0, 140.0)
      ..lineTo(160.0, 60.0)
      ..lineTo(250.0, 430.0)
      ..lineTo(300.0, 130.0);

    canvas.drawPath(path, paint3);

    Paint paint4 = Paint()
      ..color = Colors.white;

    // (5)プロットを記述
    canvas.drawCircle(const Offset(80.0,140.0), 5, paint4);
    // 点を記述
    // : 省略

    // (6)テキストを記述
    canvas.restore();

    drawPointText(canvas, 80.0, 140.0, size);
    // : 省略
  }

  // (7)文字の描写
  void drawPointText(Canvas canvas,double x,double y, Size size){

    String label = "($x,$y)";

    TextSpan span = TextSpan(
        style: const TextStyle(
            // (省略)
        ),
        children: [
          TextSpan(text: label)
        ]
    );

    // (8)テキストの表示
    TextPainter tp = TextPainter(
        text: span,
        textDirection: TextDirection.ltr
    );
    // (9)テキストのレイアウト制約
    tp.layout(minWidth: 0,maxWidth: double.infinity);
    // (10)テキストの描写
    tp.paint(canvas, Offset(x + 20.0,( size.height - 40 ) - y));
  }

  // : (省略)
}

 (1)では、まず最初にsaveメソッドでCanvasの状態を保存します。これは、この後行う中心点の移動や、また、Y座標を反転させるなどを行う前の状態が(6)以降のテキスト描写で必要になるためです。

 前述したように、y軸の向きを逆にしていますので、文字を描写する際にこのままでは文字も反転してしまいます。そこで、文字を描写する前に(1)の状態をsaveメソッドで保存しておき、(6)では、そのときの状態にもどすrestoreメソッドを使います。

 続いて(2)では、チャートの背景となるグリッド線とX軸とY軸の線を描写します。そして、折れ線を描写する際には、(3)でPaintのstyleをPaintingStyle.strokeに変更します。これをしないと図8のようになってしまいパスを閉じるように色が塗られてしまいます。

図8:styleを指定しない(PaintingStyle.fill)場合での描画例
図8:styleを指定しない(PaintingStyle.fill)場合での描画例

 そして、(4)で折れ線を記述し、(5)で各点のプロットを記述しています。(6)では先ほども説明した(7)で表示するテキストが反転しないようにy軸の反転を戻しています。また、そのため、これ以降はy軸がいままでと考え方が変わってしまいますのでご注意ください。

 Canvasにテキスト描写するには、(8)TextPainterを使います。また、(9)ではテキストの横幅のレイアウトを指定します。今回はデフォルトと同じ値を指定していますが、maxWidthを小さくすればテキストが改行されるようになります。そして、(10)でテキストの位置を指定して描写します。

まとめ

 実際にCanvasを扱っているとAPI操作よりも数学や物理知識のほうが必要と感じることもあります。しかし、簡単なチャート程度ならライブラリを使わずとも十分なことが実感してもらえたのではないかと思います。

 実際、作成するアプリのニーズに沿ったチャートを作成する場合、既存ライブラリを使った場合のデザインとの整合性やちょっと違和感の差を埋めることに時間を費やす労力を考えると自作してしまった方が楽なケースもあります。また、Canvasを使えば、既存のWidgetクラスの組み合わせでは実現が難しいアプリも作りやすくなるはずです。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Flutterで始めるモバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/19330 2024/04/24 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー