SHOEISHA iD

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

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

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

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

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

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

CanvasのAPIを利用する

 続いて、CanvasのAPIを使って具体的にどのように描写していくのか、簡単な図形の描写の場合で説明します。

キャンバスの座標と大きさ

 キャンバスのx軸とy軸は図2のようにデフォルトでは左上が(0,0)になっていて右に向かって正のx軸と下に向かって正のy軸になっています。この軸の原点の位置を移動させたい場合には、translateを使って移動させます。

 また、想定する位置と実際に表示する際の位置が異なると図形を表示したくてもその位置の計算は大変面倒になります。そこで、仮想的なCanvasサイズを想定し、それを実際の表示サイズに合わせるということになるケースが多いと思います。そのような時につかえるのがscaleです。これでサイズを縮尺します。

図2:Canvasの基本的な概念
図2:Canvasの基本的な概念

 また、scaleはサイズの縮尺以外にも、図3のように軸の向きを変えることが可能です。例えばチャートを描写する場合には、このように軸の原点と向きを自由に変えられる方が考え方も簡単になるはずです。

 ただし、図3の左のように軸を反転させると別の問題が生じるケースもあります。例えば、文字表示を行った際にもその軸の反転も有効になってしまうため注意が必要です。

図3:Canvasでのscaleの使い方(軸の向きの変更)
図3:Canvasでのscaleの使い方(軸の向きの変更)

簡単な図形を描写する

 図4のような図形をCanvas上に記述してみた例がリスト3です。

 例えば、四角形の描写であれば一点の頂点と縦横サイズで描写を指定します。また、円であれば原点とその半径サイズのように、その図形にあった座標の考え方が必要になります。

図4:四角形と円を描写例とその考え方
図4:四角形と円を描写例とその考え方
[リスト3]四角形と円を記述するCanvasの利用例(lib/screen/Sample1Screen.dartの一部抜粋)
void paint(Canvas canvas, Size size) {

  // (1)色を指定
  Paint paint = Paint()
    ..color = Colors.red;

  //  (2)マージン20にて画面一杯の四角
  Rect rect1 = const Offset(20.0, 20.0) & Size(size.width - 40.0,size.height - 40.0);
  canvas.drawRect(rect1, paint);

  Paint paint2 = Paint()
    ..color = Colors.blue;

  // (3)位置とサイズをそれぞれdoubleで指定
  Rect rect2 = Rect.fromLTWH(size.width / 2 - 50.0, size.height / 2 - 50.0, 100.0, 100.0);
  canvas.drawRect(rect2, paint2);

  Paint paint3 = Paint()
    ..color = Colors.black;

  // (4)円を記述
  canvas.drawCircle(Offset(size.width/2,size.height/2), 40, paint3);
}

 まず、最初に(1)で色を作成します。そして、(2)でdrawRectメソッドで四角を記述します。ここでは、全体に20程マージンを作り、画面サイズ一杯に四角形を描写します。

 つまり、縦横ではそれぞれ40程マージンがあることになるため、その縦横サイズで描写しています。また、(3)のfromLTWHは、left,top,width,heightの各値を指定して四角形を記述します。Rectでは、これ以外にも中心を指定する構文もあるので、利用しやすいメソッドを使ってください。

 また、(4)では中心と半径を指定して、円を描画しています。Canvasでは、このようにさまざまなdrawXXXXXメソッドを用意しているので、必要に応じたものをつかって図形や線を描写できます。

 本稿ではすべてのメソッドについての説明は省略しますが、例えば円弧を描写する場合には、drawArcページで具体的な説明が記載されていますので、それらを見ながら自分で試してみてください。

パスの合成を行う

 Canvasでは、図形を合成して新たな図形を作成することもできます。図形の合成では図5のような合成方法があります。合成するタイプによって、できあがる図形は変わるので、適したものを利用してください。

図5:図形の合成
図5:図形の合成
[リスト4] 四角形と円を記述するCanvasの利用例(lib/screen/PathCombineScreen.dartの一部抜粋)
// (1)合成するパスを作成
Path path1 = Path();
Rect rect1 = Rect.fromCenter(
  center: const Offset(-20, 0),
  height: 100,
  width: 100,
);
path1.addArc(rect1, 0, pi * 2);

// (2)合成するもう一つのパスを作成
Path path2 = Path();

Rect rect2 = Rect.fromCenter(
  center: const Offset(20, 0),
  height: 100,
  width: 100,
);
path2.addArc(rect2, 0, pi * 2);

// (3)パスを合成
Path path = Path.combine(PathOperation.union, path1, path2);
canvas.drawPath(path, paint);
図6:パスの合成結果例(unionの場合)
図6:パスの合成結果例(unionの場合)

 リスト4を実行した結果が、図6です。

 (1)で合成にもちいる一つ目のパス(図形)を作成します。そして、(2)でもう一つのパスを作成します。今回は分かりやすいように円にしていますが、どのようなパスでも問題ありません。そして、(3)で合成します。

 サンプルコードではunionをしていしてパスを合体させていますが、この部分を他のタイプに変えれば交差した図形や減算した図形が作成できます。また、合成したパスに対して、さらに合成していくこともできますので、これでより複雑な絵が描けます。

次のページ
チャートを作ってみる

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー