PhoneGapでSencha Touchを使っためも
PhoneGapでSencha Touchを使ったときに、PhoneGapのJavascriptブリッジを有効にする方法が少し特殊だったため、メモしておきます。あわせてSench(Ext JS)風味の書き方ものせておきます。
参考サイト
Sencha Touch
http://www.extjs.co.jp/
Sencha Touchドキュメント
http://www.extjs.co.jp/deploy/touch/docs/
Tutorial:A Sencha Touch MVC application with PhoneGap
http://www.sencha.com/learn/Tutorial:A_Sencha_Touch_MVC_application_with_PhoneGa
PhoneGap
http://www.phonegap.com/home/
概要
PhoneGapでは、onDevideReadyイベント後にJavascriptブリッジが有効になるため、以下のようにコーディングしていると思います。
- body onloadに登録する例
<script type="text/javascript"> funciton onLoad() { document.addEventListener("deviceready", onDeviceReady, false); } function onDeviceReady() { } </script> ... <body onload="onLoad();"> ... </body>
ただ、PhoneGapでSencha Touchを利用する場合、上記の方法ではうまくいかないようです。そのためここでは、PhoneGap.jpの初期化後にSencha Touchのアプリケーションクラスを初期化するにします。おおまかな手順は以下のようになります。
- Sencha Touchのアプリケーションクラス(Ext.Application)の作成
- onDevicereadyイベントでSencha Touchのアプリケーションクラスの初期化を行うコードを追加
- Viewクラス(Ext.Panel)の作成
- PhoneGapのJavascriptブリッジクラスを使ってみるクラスを追加
サンプルコード
Sencha Touchのアプリケーションクラス(Ext.Application)の作成
Sencha Touchのアプリケーションクラスを作成します。
view、controller、modelをサポートした、MVCアプリケーションとして利用できますが、ここではviewのみ設定します。
- js/sample.js
/** * アプリケーションクラス登録 */ Ext.regApplication({ name: 'app', launch: function() { this.launched = true; this.mainLaunch(); }, mainLaunch: function() { console.log('start mainLaunch'); if (!device || !this.launched) {return;} console.log('mainLaunch'); // ページView生成。後の手順で宣言している「Ext.app.views.Viewport」です this.views.viewport = new this.views.Viewport(); } });
mainLaunchメソッドでdevice変数のチェックを行っていますが、スマートフォンのときのみ有効な変数です。デスクトップで動作の確認を行いたい場合は、この部分をコメントアウトすると動作します。
onDevicereadyイベントでSencha Touchのアプリケーションクラスの初期化を行うコードを追加
PhoneGapの初期化が終わってからSencha Touchのアプリケーションクラスを初期化します。
- index.html
<!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="css/sencha-touch.css"> <script type="text/javascript" charset="utf-8" src="js/sencha.js"></script> <script type="text/javascript" charset="utf-8" src="js/phonegap.js"></script> <script type="text/javascript" charset="utf-8" src="js/sample.js"></script> <script type="text/javascript"> document.addEventListener("deviceready", app.mainLaunch, false); </script> </head> <body></body> </html>
onDevicereadyイベントにapp.mainLaunchを登録します。
Viewクラス(Ext.Panel)の作成
ヘッダとフッダのパネルのあるページです。
- js/sample.js
/** * View */ app.views.Viewport = Ext.extend(Ext.Panel, { tabletStartupScreen: 'images/startup.png', phoneStartupScreen: 'images/startup.png', icon: 'icon.png', glossOnIcon: false, initComponent: function() { var me = this; var panel = new Ext.Panel({ // Ext.Panelクラスを拡張する fullscreen: true, cls: 'cards', componentCls: 'bodycls', // cssのclassを指定できる centered: true, layout: { type: 'vbox', align: 'stretch' }, defaults: { flex: 1 }, html: [ '<p>hello sencha touch</p>', '<button onclick="vibrate();">vibrate</button>' ], // ツールバーなどのdock item定義 dockedItems: [ { dock : 'top', xtype: 'toolbar', // Ext.Toolbarクラスを指定 title: 'HELLO SENCHA TOUCH', cls : 'topcls', }, new Ext.Toolbar({ // Ext.Tollbarを直接生成してもよい dock : 'bottom', title: 'copylight hoge', cls : 'bottomcls', }), ], }); // パネル構築 panel.doComponentLayout(); } });
以下の部分がツールバーに囲まれた部分に表示されます。
html: [ '<p>hello sencha touch</p>', '<button onclick="vibrate();">vibrate</button>' ],
PhoneGapのJavascriptブリッジクラスを使ってみるクラスを追加
PhoneGap APIのnavigator.notification.vibrateを使ってみます。
js/sample.js
/** * 振動 */ Ext.app.Vibrate = Ext.extend(Object, { name: 'vibrate', vibrateCount: 0, vibrateTime: 0, constructor: function(config) { var me = this; Ext.apply(me, config); // configのキーと値をインスタンスのフィールドとして設定する }, play: function() { console.log("vibrate play"); navigator.notification.vibrate(this.vibrateTime); } }); /** * 振動呼び出し */ function vibrate() { var v = new Ext.app.Vibrate({'vibrateTime':200}); v.play(); }
Ext.extendを使って、Objectの拡張クラスを作成します。Ext.applyを利用して、パラメータの設定を行います。
app.views.Viewportの以下の部分で呼び出しています。
<button onclick="vibrate();">vibrate</button>
以上です。起動すると、以下のように表示されると思います。