SHOEISHA iD

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

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

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

 Webアプリなどでもチャートのような描写や画像編集アプリ、アニメーションなどをおこなう場合にCanvasを使います。Flutterでも同様に、自由な描写をする際にはCanvasが利用できます。今回はCanvasの基本的な利用から簡単なチャート作成の方法までを紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

Canvasの利用について

 FlutterのCanvasもHTMLのCanvasも同じように何も描写されていないキャンバス(白紙)の部品です。そこにプログラムを用いて、文字や図形、もしくは線、画像など様々な描写が可能です。

 したがって、どのような表示であってもこのCanvasを使えば理論上は行えます。しかし、多くの場合には簡単なチャートや画像操作の補助などをする際に使うなどが多いと思いますので、今回はそのような利用を前提として紹介します。

本格的な描写や利用を行うライブラリ

 Canvasを用いて本格的なチャートや2Dゲームを作りたい場合には、多くの場合はCanvasのAPIを直接使わず、以下のようなライブラリを使うと良いでしょう。

 似たようなライブラリはこれ以外にもあると思います。例えば、上記のようなより汎用的で専門的なものから、もっと具体的な利用に特化したものや限定的な利用のみをカバーするものなどいろいろ調べるとあるはずです。

 それらのライブラリを利用する場合にも、今回紹介する基本部分だけでも理解していれば、自分が利用したい目的に応じて対応できるケースも多くなるはずです。

Canvasの主な使い方

 Canvasには、図1のように画面に表示するUIもしくは部品として利用する場合と、非表示用にプログラムで画像作成のために利用する場合があります。より一般的な使い方は前者だと思いますが、画像から部分的に領域を抜き出して表示する際の、裏方の編集用としてCanvasを利用することも可能です。

図1:Canvasの主な用途例
図1:Canvasの主な用途例

表示部品としてCanvasを利用する流れ

 表示用の部品としてCanvasを利用する場合には、CustomPaintというウィジェットを利用します。

 リスト1は、CustomPaintをつかって、Canvasを利用する場合のコード例です。

[リスト1]CustomPaintの利用コード例(lib/screen/Sample1Screen.dartの一部抜粋)
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar : AppBar(
      title : const Text("サンプル1")
    ),
    body: SizedBox(
      width: double.infinity,
      height: double.infinity,
      child: CustomPaint(
        // (1)実際にCanvasで描写をする処理
        painter: SamplePainter(),
      ),
    ),
  );
}

 実際のCanvas操作はCustomPainterというクラスを継承したクラスで行い、その指定を(1)のように行います。また、実際にCanvas操作を行うSamplePainterではリスト2のようにpaintメソッドとshouldRepaintメソッドを実装します。

[リスト2]CustomPainterの継承クラス例(lib/screen/Sample1Screen.dartの一部抜粋)
class SamplePainter extends CustomPainter{

  @override
  void paint(Canvas canvas, Size size) {
    // (1)このメソッド内でcanvas操作を行う
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    //  (2)再描写の判定
    return false;
  }
}

 (1)のpaintメソッド内でCanvasに対して描写処理を記述します。そして、(2)が再描写が必要かの判定処理になります。描画の再処理は通常のWidgetの再描写であるbuildでも行われますが、こちらは、Canvasの再描写になります。Canvasでアニメーションや利用者からのインタラクティブな操作に応じた再描写などが必要なければ、falseと固定値を返すようにして問題ありません。

非表示部品としてCanvasを利用する流れ

 非表示のCanvasとして利用する場合には、Canvasオブジェクトを作成する必要があります。

 その際には、PictureRecorderというCanvasで描写した内容をあとでデータとして利用するためのクラスと共に用います。リスト2はそのコード例です。

[リスト2]PictureRecorderを用いたCanvasの利用例(lib/screen/TouchRectScreen.dartの一部抜粋)
// (1) 必要なインポート処理
import 'dart:ui' as ui;
// ・・・ 省略
// (2) 画像記録用クラス
var pictureRecorder = ui.PictureRecorder();
// (3) Canvasの作成
ui.Canvas canvas = ui.Canvas(pictureRecorder);
//
// Canvas操作を行う
//
// (4) サイズを指定して画像を取得
ui.Image newImage = await pictureRecorder.endRecording().toImage(width,height);
// ・・・ 省略

 (1)では必要なクラスを使うためにdart:uiをインポートします。また、Imageクラスなどは、flutter/materialのパッケージ内の別なクラスと名前がかぶるためここでは別名をつけています。

 そして、(2)でキャンバスに描写した内容を記録するためのクラスを作成し、そのクラスをつかって(3)のようにキャンバスを作成します。

 あとは、Canvasへ好きな描写を行い、最後に(4)のように画像データを取得するような流れになります。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
CanvasのAPIを利用する

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19330 2024/04/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング