こんにちは、石尾です。
前回は、Herlockを触った程度で終わりました。
今回から、Herlockによるアプリの実装に関して投稿していこうと思います。
※前回同様に、Herlockはクローズドベータ版を利用しています。
Herlockの仕組み
Herlockは、JavaScriptだけで実装できると前回紹介しましたが、ネイティブアプリでよく利用するWebViewを使いブラウザ(HTML)表示をしている訳ではありません。JavaScriptエンジン自体を拡張して、描画はOpenGLにより行っています。
とすると、画面レイアウトの実装やその利用APIなど細かく覚える必要があるのでは!?と思いましたが、
描画レイアウトの構成は、Flashの表示リストやHTMLのDOMのようなツリー構造であるため、それほど理解しがたいことはないと思います。
(ただ、複雑な画面のアプリ作成の場合は、まだ判断しがたいですが、)
詳しく知りたい方は、株式会社ソニックムーブのブログを参照してください。
Herlockの内部的な仕組みと開発コンセプト | SONICMOOV LAB
【中級編】Herlockにおけるライブラリの使用 | SONICMOOV LAB
Javascript&OpenGLで作るネイティブアプリ
HerlockのAPI:Layer
コーディングする前に、Layerについてちょっと説明をします。
Layerは、描画コンテンツ(ImageやStageなど)を画面に投影するためのコンテナです。画面サイズの端末差異を吸収する役割(scaleModeプロパティで調整)を担います。Window上に複数のLayerを重ねて、表示します。

※Imageは、画像データの読み込み・保持や描画を行います。HTMLのimageタグのようなもの。
※Stageは、Layerの表示ツリー構成要素。ルート要素となります。
※WebGLは、3Dグラフィック要素、CanvasはHTMLのcanvasタグのようなものと予想。(Herlock内に情報が見つからなかった)
LayerのscaleModeプロパティは、次の4つがあります。

| showAll(Layer.SCALE_SHOW_ALL) | アスペクト比を維持しコンテンツ全体がスクリーンに収まるように描画。スクリーンが余る。 |
| noBorder(Layer.SCALE_NO_BORDER) | アスペクト比を維持したままスクリーン全体に描画。コンテンツがスクリーンからはみ出す。 |
| noScale(Layer.SCALE_NO_SCALE) | 拡大縮小なし。 |
| exactFit(Layer.SCALE_EXACT_FIT) | アスペクト比を無視しスクリーン全面に描画 |
また、Layerの配置を垂直方向verticalAlignプロパティと水平方向horizontalAlignプロパティで設定します。

| Layer.verticalAlign | |
| top(Layer.VALIGN_TOP) | 上寄せ |
| middle(Layer.VALIGN_MIDDLE) | 中央寄せ |
| bottom(Layer.VALIGN_BOTTOM) | 下寄せ |
| Layer.horizontalAlign | |
| left(Layer.HALIGN_LEFT) | 左寄せ |
| center(Layer.HALIGN_CENTER) | 中央寄せ |
| right(Layer.HALIGN_RIGHT) | 右寄せ |
テキスト表示サンプル
プロジェクト作成時のテンプレートを「TextSample」に設定すると、次のコードが実装されたプロジェクトが作成されます。
var stage = new Stage( 320, 640 ); addLayer( new Layer( stage ) ); var textField = new TextField(); textField.defaultTextFormat = new TextFormat( null, 25, 0xff0000 ); textField.text = "テキスト"; stage.addChild( textField );
Stageオブジェクトを生成し、引数320が横幅、640が縦幅をpx単位で設定しています。
Layerオブジェクトを生成し、Stageオブジェクトを設定しています。
テキストオブジェクトTextFieldを生成し、Stageオブジェクトの子要素として設定しています。
レイアーサンプル
プロジェクト作成時のテンプレートを「LayerSample」に設定すると、次のコードが実装されたプロジェクトが作成されます。
(function () {
// header 上に吸着
var headerLayer = new Layer(new Stage(640, 80));
headerLayer.verticalAlign = "top";
headerLayer.scaleMode = "showAll";
// content 多少端が切れてもいいデザインで、必ず表示したいものは中央に寄せる
var contentLayer = new Layer(new Stage(300, 300));
contentLayer.verticalAlign = "middle";
contentLayer.scaleMode = Layer.SCALE_NO_BORDER;
// header 下に吸着
var footerLayer = new Layer(new Stage(640, 80));
footerLayer.verticalAlign = "bottom";
footerLayer.scaleMode = "showAll";
//
window.addLayer(contentLayer);
window.addLayer(footerLayer);
window.addLayer(headerLayer);
//
var header = new TextField();
header.width = 640;
header.height = 80;
header.background = true;
header.backgroundColor = 0x0;
header.defaultTextFormat = new TextFormat(null, 30, 0xffffff);
header.text = "header";
header.alpha = 0.7;
headerLayer.content.addChild(header);
//
var image = new Image();
image.src = "assets/images/image.png";
image.onload = function () {
contentLayer.verticalAlign = "middle";
contentLayer.scaleMode = "noBorder";
contentLayer.content.addChild(new Bitmap(new BitmapData(image)));
};
//
var footer = new TextField();
footer.width = 640;
footer.height = 80;
footer.background = true;
footer.backgroundColor = 0x0;
footer.defaultTextFormat = new TextFormat(null, 30, 0xffffff);
footer.text = "footer";
footer.alpha = 0.7;
footerLayer.content.addChild(footer);
})();
headerLayer、contentLayer、footerLayerの3つのLayerを生成し、それぞれverticalAlignとscaleModeプロパティを設定しています。そして、親となるwindowオブジェクトにLayerを追加設定しています。
※このサンプルでは、名前空間を意識してでしょうか? function(){};即時関数として定義しています。
プロジェクト内のファイル構成
作成したプロジェクトは、次のようなフォルダ構成となっています。
上記で生成されたコードは、main.jsで実装されます。
{プロジェクトルートフォルダ}
│ main.js
│ README.md
├─app
│
└─assets
├─images
│ image.png
│
└─sounds
ちなみに、HerlockによりビルドしたAndroidデバッグアプリのapkファイルをjarコマンドで展開するとassetsフォルダ配下のassets.zipファイルに上記のプロジェクトルートフォルダが圧縮されて登録されています。
{ルートフォルダ}
│ AndroidManifest.xml
│
├─assets
│ assets.zip
・・・
感想
レイアウトの実装は、Androidアプリ開発でのXMLレイアウトファイルなどを使うわけでなく、またHTMLで作成するのでなく、JavaScriptでごりごり実装する必要があります。また、他画面構成の場合、親となるwindowオブジェクトに対してLayer追加・削除を行い、画面遷移等の制御をする必要があるなぁと思いました。
また、今回Herlockを使っていて気付いたのです。HerlockViewerで開発アプリを実行していますが、実機上に開発アプリはインストールされていません。HerlockViewer内で、アプリを実行しているだけのようです。
引き続き、アプリの実装に関してレポートしていきたいと思います。


