--:-- LUA API

手書き入力(CanvasRaster)

CanvasRasterで自由線を描き、保存・読み込みする

CanvasRaster(pico.create("CanvasRaster"))は、Canvas と違って描いた絵を自分で覚えているウィジェットです。指でなぞった跡をそのまま線として残すので、render コールバックを書く必要がありません。手書きメモ・お絵描き・署名欄のような自由線描画に向いています。

最小構成

local x, y, w, h = pico.content_rect()

local canvas = pico.create("CanvasRaster")
pico.set(canvas, "x", x)
pico.set(canvas, "y", y)
pico.set(canvas, "w", w)
pico.set(canvas, "h", h)
pico.set(canvas, "canvas_mode", pico.CANVAS_LINE) -- フリーハンド
pico.set(canvas, "color", pico.COLOR_BLACK)
pico.set(canvas, "brush_radius", 2)

これだけで、指(マウス)でドラッグした軌跡がそのまま線として残ります。Canvas のように毎フレーム全部を描き直す必要が無く、過去に描いた線をLua側で覚えておく必要もありません。

w/h は作った直後に1回だけ設定してください。 大きさを変えると、それまでに描いた絵は消えます。

ペンの色を変える

pico.set(canvas, "color", pico.COLOR_BLUE)

消しゴム

専用の「消しゴムモード」はありません。白(pico.COLOR_WHITE = 15)をペンの色にするのが消しゴムです。太めのブラシにしておくと消しやすくなります。

pico.set(canvas, "color", pico.COLOR_WHITE)
pico.set(canvas, "brush_radius", 8)

全消去

pico.canvas_clear(canvas)

保存・読み込み

キャンバスの絵は .pimg(画像と同じ形式)としてSDへ保存し、読み戻せます。

local SAVE_PATH = pico.path_join(pico.app_dir(), "memo.pimg")

pico.canvas_save(canvas, SAVE_PATH) -- 成功ならtrue
pico.canvas_load(canvas, SAVE_PATH) -- 成功ならtrue。キャンバスの大きさも保存したときの大きさになる

引数・失敗する条件・元に戻す(pico.canvas_undo)は APIリファレンス: ラスタキャンバス を参照してください。

描画モード(canvas_mode)

canvas_mode を変えると、なぞったときに描くものが変わります。

値定数描くもの
0CANVAS_LINEなぞった跡をそのまま線にする(既定。手書きに使う)
1CANVAS_RECTなぞり始めと終わりを対角にした四角
2CANVAS_ELLIPSEなぞった範囲に内接する楕円
3CANVAS_ARROWなぞり始めから終わりへの矢印
4CANVAS_STRAIGHTなぞり始めから終わりへの直線
5CANVAS_FILL触れた所とつながった同じ色の範囲を塗りつぶす

四角・楕円・矢印・直線は、なぞっている間は下書きだけを見せ、指を離したときに描きます。四角・楕円は filled = true で塗りつぶしになります。

完成例: 2色ペン+消しゴムのスクラッチパッド

黒ペン・青ペン・消しゴム・全消去・保存・読込のボタンを揃えた最小のメモアプリです。全体は「スクラッチパッド」アプリ(/lua/apps/スクラッチパッド/main.lua)にあります。描く場所を広く取るため、ツールバーは文字ではなくアイコンのボタン(pico.set(id, "icon_id", ...)。Button)にしてあります。

local canvas = pico.create("CanvasRaster")
-- (x/y/w/hの設定は省略)

local btn_black = pico.create("Button")
pico.set(btn_black, "icon_id", pico.ICON_Brush)
pico.set(btn_black, "background_color", pico.COLOR_BLACK) -- 背景をペンの色にする
-- (他のボタンも同様。x/y/w/hの設定は省略)

local function selectPen(color, radius)
    pico.set(canvas, "color", color)
    pico.set(canvas, "brush_radius", radius)
end

pico.on(btn_black, "press_start", function() selectPen(0, 2) end)   -- 黒
pico.on(btn_blue, "press_start", function() selectPen(9, 2) end)    -- 青
pico.on(btn_eraser, "press_start", function() selectPen(15, 8) end) -- 消しゴム

pico.on(btn_clear, "press_start", function() pico.canvas_clear(canvas) end)
pico.on(btn_save, "press_start", function() pico.canvas_save(canvas, SAVE_PATH) end)
pico.on(btn_load, "press_start", function() pico.canvas_load(canvas, SAVE_PATH) end)