SHOEISHA iD

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

連載記事

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

翔泳社では、「独習」「徹底入門」「スラスラわかる」「絵で見てわかる」「一年生」などの人気シリーズをはじめ、言語や開発手法、最新技術を解説した書籍を多数手がけています。プロジェクトマネジメントやチームビルティングといった管理職向けの書籍も豊富です。

ITエンジニアとしてのスキルアップ・リスキリングに、ぜひお役立てください。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
Flutterで始めるモバイルアプリ開発

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

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

ダウンロード サンプルファイル (8.4 KB)

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

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)のように画像データを取得するような流れになります。

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

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

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます
  • ・翔泳社の本が買える!
    500円分のポイントをプレゼント

メールバックナンバー

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

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

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編 」他、著書多数。

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

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

この記事をシェア

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

おすすめ

アクセスランキング

  1. 1
    GitHub Copilot BusinessとProでClaudeとCodexが利用可能に
  2. 2
    Google Workspaceで直近発表された新機能をまとめて紹介 NEW
  3. 3
    プログラミング問題集「Exercise」シリーズ全5冊が3/10まで半文公開 C++、JS、Pyhon、Go、Rustもあり NEW
  4. 4
    Perplexity、複数のAI機能を単一のシステムに統合する「Perplexity Computer」リリース NEW
  5. 5
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  1. 6
    GitHub Copilot、Gemini 3 ProとGPT-5.1-Codexなどを廃止へ NEW
  2. 7
    パナソニックはなぜ開発環境の「文房具化」に挑んだのか──グループ横断で進めた開発環境改革の舞台裏
  3. 8
    ITエンジニア本大賞 2026の最終プレゼンをレポート 栄冠に輝いた著者が語る本の魅力
  4. 9
    「REPL」 ~マンガでプログラミング用語解説
  5. 10
    Notion、ページをフルスクリーンプレゼンテーションにする新機能を発表 NEW

アクセスランキング

  1. 1
    GitHub Copilot BusinessとProでClaudeとCodexが利用可能に
  2. 2
    Google Workspaceで直近発表された新機能をまとめて紹介 NEW
  3. 3
    プログラミング問題集「Exercise」シリーズ全5冊が3/10まで半文公開 C++、JS、Pyhon、Go、Rustもあり NEW
  4. 4
    Perplexity、複数のAI機能を単一のシステムに統合する「Perplexity Computer」リリース NEW
  5. 5
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  6. 6
    GitHub Copilot、Gemini 3 ProとGPT-5.1-Codexなどを廃止へ NEW
  7. 7
    パナソニックはなぜ開発環境の「文房具化」に挑んだのか──グループ横断で進めた開発環境改革の舞台裏
  8. 8
    ITエンジニア本大賞 2026の最終プレゼンをレポート 栄冠に輝いた著者が語る本の魅力
  9. 9
    「REPL」 ~マンガでプログラミング用語解説
  10. 10
    Notion、ページをフルスクリーンプレゼンテーションにする新機能を発表 NEW
  1. 1
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  2. 2
    【速報】ITエンジニア本大賞 2026、技術書部門とビジネス書部門の大賞が決定!
  3. 3
    「LTSとSTS」 ~マンガでプログラミング用語解説
  4. 4
    GitHub、Markdownで目標を記述することでタスクを自動実行する「Agentic Workflows」公開
  5. 5
    「否定された」と感じさせないコードレビューの作法。チームを育てるテキストコミュニケーションとは?
  6. 6
    Claude Skillsとは? AIエージェント開発における新たなベストプラクティスをやさしく解説
  7. 7
    「REPL」 ~マンガでプログラミング用語解説
  8. 8
    C++の新機能を理解する──静的なoperator()/operator[]と多次元対応operator[]など言語仕様の強化
  9. 9
    最新バージョン.NET 10/Visual Studio 2026の登場が、開発者にいかなる価値をもたらすか──「ECHO 2025」開催
  10. 10
    Apple、2026年4月からiOSアプリの新SDK対応を必須化

イベント

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

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

メールバックナンバー

アクセスランキング

  1. 1
    GitHub Copilot BusinessとProでClaudeとCodexが利用可能に
  2. 2
    Google Workspaceで直近発表された新機能をまとめて紹介 NEW
  3. 3
    プログラミング問題集「Exercise」シリーズ全5冊が3/10まで半文公開 C++、JS、Pyhon、Go、Rustもあり NEW
  4. 4
    Perplexity、複数のAI機能を単一のシステムに統合する「Perplexity Computer」リリース NEW
  5. 5
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  1. 6
    GitHub Copilot、Gemini 3 ProとGPT-5.1-Codexなどを廃止へ NEW
  2. 7
    パナソニックはなぜ開発環境の「文房具化」に挑んだのか──グループ横断で進めた開発環境改革の舞台裏
  3. 8
    ITエンジニア本大賞 2026の最終プレゼンをレポート 栄冠に輝いた著者が語る本の魅力
  4. 9
    「REPL」 ~マンガでプログラミング用語解説
  5. 10
    Notion、ページをフルスクリーンプレゼンテーションにする新機能を発表 NEW

アクセスランキング

  1. 1
    GitHub Copilot BusinessとProでClaudeとCodexが利用可能に
  2. 2
    Google Workspaceで直近発表された新機能をまとめて紹介 NEW
  3. 3
    プログラミング問題集「Exercise」シリーズ全5冊が3/10まで半文公開 C++、JS、Pyhon、Go、Rustもあり NEW
  4. 4
    Perplexity、複数のAI機能を単一のシステムに統合する「Perplexity Computer」リリース NEW
  5. 5
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  6. 6
    GitHub Copilot、Gemini 3 ProとGPT-5.1-Codexなどを廃止へ NEW
  7. 7
    パナソニックはなぜ開発環境の「文房具化」に挑んだのか──グループ横断で進めた開発環境改革の舞台裏
  8. 8
    ITエンジニア本大賞 2026の最終プレゼンをレポート 栄冠に輝いた著者が語る本の魅力
  9. 9
    「REPL」 ~マンガでプログラミング用語解説
  10. 10
    Notion、ページをフルスクリーンプレゼンテーションにする新機能を発表 NEW
  1. 1
    GitHub CopilotがClaude Opus 4.1、GPT-5、GPT-5-Codexの非推奨を発表
  2. 2
    【速報】ITエンジニア本大賞 2026、技術書部門とビジネス書部門の大賞が決定!
  3. 3
    「LTSとSTS」 ~マンガでプログラミング用語解説
  4. 4
    GitHub、Markdownで目標を記述することでタスクを自動実行する「Agentic Workflows」公開
  5. 5
    「否定された」と感じさせないコードレビューの作法。チームを育てるテキストコミュニケーションとは?
  6. 6
    Claude Skillsとは? AIエージェント開発における新たなベストプラクティスをやさしく解説
  7. 7
    「REPL」 ~マンガでプログラミング用語解説
  8. 8
    C++の新機能を理解する──静的なoperator()/operator[]と多次元対応operator[]など言語仕様の強化
  9. 9
    最新バージョン.NET 10/Visual Studio 2026の登場が、開発者にいかなる価値をもたらすか──「ECHO 2025」開催
  10. 10
    Apple、2026年4月からiOSアプリの新SDK対応を必須化