9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ionic2とp5.jsで簡単なお絵かきアプリ

9
Last updated at Posted at 2017-03-05

やったこと

ProcessingライクなJavascriptライブラリp5.jsと、
最近2.0が正式リリースされたIonicを組み合わせて簡単なお絵かきアプリの作成。

結果がこんな感じ

前提

Nodejsがインストールされていること。
Ionic cliがインストールされていること。

手順

空のIonicアプリを作成。

$ ionic start p5sample blank --v2

p5.js downloadから「p5.js complete」をダウンロード。
解凍した中身を

p5sample/src/assets/lib

以下にコピー。

p5sample/src/index.html

<script src="./assets/lib/p5.min.js"></script>

を追加。

home.htmlをこんな感じに編集。
id="myCanvas"指定しているところにCanvasが挿入されます。

<div class="content-area">
  <!-- ここにCanvasが展開される -->
  <div id="myCanvas" #myCanvas class="canvas-area">
  </div>

  <!-- ボタン領域 -->
  <div class="action-button-area">
    <!-- 赤色 -->
    <button ion-button icon-only clear class="color-red" (click)="onRed()">
      <ion-icon name="brush"></ion-icon>
    </button>

    <!-- 青色 -->
    <button ion-button icon-only clear class="color-blue" (click)="onBlue()">
      <ion-icon name="brush"></ion-icon>
    </button>

    <!-- 黄色 -->
    <button ion-button icon-only clear class="color-yellow" (click)="onYellow()">
      <ion-icon name="brush"></ion-icon>
    </button>

    <!-- ペンの太さ -->
    <ion-item class="stroke-width">
      <ion-range min="5" max="15" [(ngModel)]="strokeWidth">
        <ion-icon range-left small name="brush"></ion-icon>
        <ion-icon range-right name="brush"></ion-icon>
      </ion-range>
    </ion-item>
    
  </div>
</div>

home.scssはこんな感じに。
パーツの位置指定とペンの色を設定しています。


page-home {

    .content-area {
        overflow: hidden;
        height: 100%;
        width: 100%;
    }

    .canvas-area {
        position: relative;
        height: 90%;
    }

    .action-button-area {
        position: relative;
        height: 10%;
        background-color: #ddd;
        display: flex;
    }

    .color-red {
        color: #ff0000;
    }

    .color-blue {
        color: #0000ff;
    }

    .color-yellow {
        color: #ffff00;
    }

    .stroke-width {
        background: transparent;
    }
}


home.tsはこんな感じで。
p5をインスタンスモードで使用している点と、
parentでcanvasの展開位置を指定している点がみそです。

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

declare var p5: any;

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  myp5: any;
  penColor: string; // ペンの色
  strokeWidth: number;  // ペンの太さRangeパーツで値が変動する

  constructor(public navCtrl: NavController) {}

  ionViewDidEnter() {

      this.penColor = 'red';  // デフォルトは赤
      this.strokeWidth = 10;  // デフォルトの太さを10に設定

      var s = (p) => {

        // キャンバスのセットアップ
        p.setup = function(){
          var cnv = p.createCanvas(document.getElementById('myCanvas').clientWidth, document.getElementById('myCanvas').clientHeight);
          cnv.parent('myCanvas'); // id="myCanvas"と紐づけ
        };

        // タッチイベントを受けて処理が走る。
        p.touchMoved = () => {

          // ペンの太さ
          p.strokeWeight(this.strokeWidth);

          // ペンの色
          p.stroke(this.penColor);

          // なぞったエリアに線を描画
          p.line(p.mouseX, p.mouseY, p.pmouseX, p.pmouseY);
          return false;
        };
      }

      // インスタンスモード
      this.myp5 = new p5(s);
  }

  // 色を赤に
  onRed() {
    this.penColor = 'red';
  }

  // 色を青に
  onBlue() {
    this.penColor = 'blue';
  }

  // 色を黄色に
  onYellow() {
    this.penColor = 'yellow';
  }
}

動作確認。

$ ionic serve

結果がこんな感じ

日曜日のお昼の暇つぶしにはじゅうぶんでないでしょうか。

感想

結果が目に見えて、なおかつ操作できちゃうものを作るのは楽しいですね。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?