2013年3月14日木曜日

sencha touchであとやっておきたいことメモ

MusicTubeですが、機能が充実してきました。
いまのところバージョン0.12(beta)です。

昨日android端末でもちゃんと動作するようにしたいなと思い、sencha touchのaudio用の動作Ext.Audioをやめて、audioTagを自分で書く形に修正したのですが、いくつかまだ不備があるみたいです。

というわけでやったこととやっておきたいことのメモ

やったこと:
・swipeメニュー移動(タイトルバーをswipeすると移動します。)
・簡単プレイリスト変更機能(タイトルバーダブルタップで変更)
・playerをaudioタグからsenchaのスキンベースのカスタムに変更。
・スキンの入れ替え機能(Ads & Secrets)
・player再生速度変更機能(Ads & Secrets)
・youtubeへのリンク機能(曲リストで左にswipeする)

やらないといけないこと:
・pickerの下にtextボックスもしくはtextAreaがあるときの対策
・バージョン通知動作
・安全なバージョン更新動作
・壊れたときにリセットするページ準備
・各secretの動画準備とリンクをつくる件
・background再生時に複数曲リスト動作がきちんと動作するようにする件

このあたりやっておきたいところ。

で、どうやって対処するか。(一応予想です)

・pickerの下にtextボックスもしくはtextAreaがあるときの対策
→picker選択時に対象エレメントをreadOnlyにする、pickerがなくなったときにreadOnlyを解除する。
で、いけると思う。

・バージョン通知動作
→適当なjsonファイルをつくっておいておき、ページにアクセスしたときにajax通信で確認させる。

・安全なバージョン更新動作
→localStorageからsenchaのつくっている部分を削除してやればいけるはず。
ただし更新時の読み込み量はふえちゃうけど。

・壊れたときにリセットするページ準備
→同上localStorageからsenchaのコントロール部分を削除してやればよいはず。

・各secretの動画準備とリンクをつくる件
→動画を撮ってyoutube

・background再生時に複数曲リスト動作がきちんと動作するようにする件
→ひたすらデバッグする。

こんな感じか。
さて、1つずつやってくか。

2013年3月8日金曜日

musicTubeをsencha touch化しました。

もともとjqmobiでつくっていたmusicTubeですが、sencha touchに変えました。

理由は・・・
・タップイベントがどうも内部でループしてるっぽい。
・あたらしいappmobiのcdnが文字化けして使えない。(古い方のcdnが生き残っていますがいつ消されるかわからないし。)
ということでsenchaに手をだしてみました。

で、できたのがこちら

今回このアプリを作る上でつかったものですが・・・
・senchaコマンドの利用
・sassの変更によるcssのコンパイル
・sencha-SlideNavigationの利用
・Historyサポートの利用
・Ext.dataview.ListをやめてExt.dataview.DataViewを利用
・audioタグnativeのコントロールをとりやめ、senchaで書き直し
・setHtmlによるtext書き直しをやめてinput textによる書き直しに変更

このあたりつかってます。

まずsenchaコマンドの利用です。
sencha touchでは、動作を便利にするコマンドプログラムを公開されてます。
どうやら中身はjavaで書かれてるっぽいですね。利用するとhtmlやjavascript、cssの最適化等を実行してファイルサイズを小さくしてくれたり、httpのアクセス回数を軽減してくれたりと、いろいろとやってくれます。
またプロジェクトのテンプレートを自動で生成してくれるので、作業効率が若干あがるかもしれません。
よく使うコマンドは
$ sencha generate app (アプリ名) (設置パス)
$ sencha app build production
$ sencha generate controller (コントローラー名)
このあたりです。
上から順に
・アプリのテンプレート作成
→こちらは生成用のコマンドがバージョンによってかわるみたいです。
わかりにくいので、senchaつかっている人に尋ねるのが一番手っ取り早いかも。

・deploy用のデータ生成
→こちらは頻繁にお世話になるコマンド、できたプログラムをコンパクトにしてくれます。
10Mくらいあるのが1M程度まで縮んだりしますね。
便利なんですが、生成DOMの構成とかまで変わってしまうので、変わったことをしている場合は要注意です。

・コントローラー自動生成
viewもいくつかつくっているのですが、こちらはコマンドではなく、手書きでつくっています。


続いてsassの利用
cssなのに変数とか条件分岐とか関数とかがつかえるアレです。
利用するのに、compassのインストールが必要です。
で、使うコマンドは$ compass compile
とりあえず3点だけ手を加えています。

1つ目はpictosアイコンの追加です。
必要なアイコンだけ利用できるので、便利ですね。ただ、始めはやり方がわからなくて、アイコン画像はあるのに使えないじゃないか、って思ってしまいました。

2つ目はsassファイルを自作しました。
理由はExt.dataview.Listの動作が気に入らなかったのでExt.dataview.DataViewを利用することにしたのですが、選択状態のいい感じのcss定義がなかったので、それを記述するのに使いました。

3つ目はplayerをsencha化するときにsliderを利用しているのですが、大きさが気に入らなかったのでサイズの変更を実施してあります。


次につかったのがsencha slideNavigationです。
facebookアプリにあったという横にスライドさせるとメニューがでるやつです。
簡単に利用できるんですが、タイトルバーのflicによる遷移を追加しようとしたり、historyサポートと連携させようとしたときに、ちょっと動作の解析する必要になったのが面倒でした。
最近senchaがどうやっているのかわかってきたので、この部分も自作しちゃおうかなとおもったりしています。というのも左右のスライド動作がちょっと動きが良くないんですよね。もっとうまい動作つくれると思うんで、いじろうかな・・・と。


Historyサポート。
httpのhashの部分を変更することで、ブラウザの戻るを実行したときに、アプリケーションのパネルを入れ替えることができるようになるという。
あと、historyに検索キーワードをいれることで、検索履歴も残るといういい点もあります。
動作をつくるのはコントローラーに細工すればいいだけなので、簡単だったんですが、結果をslideNavigationに適応するのが面倒でした。


Ext.dataview.ListをやめてExt.dataview.DataViewを利用した件。
Ext.dataview.Listをつかって大量の曲を並べた場合、動作が引っかかる現象が発生しました。
chromeの要素解析で確認したところ、Listの要素ごとにcssアニメーションが動いていたみたいです。計算項目が増えて動作が悪くなるということになっていた模様です。
で、Listはさくっとあきらめて、一つ上のDataViewを直接いじりました。
現状ではほぼ同じ動作(アイテムの区切りが微妙になかったりしますが)ですが、cssアニメーション的には1枚の板が移動している感じになっています。
list系のコンポーネントは内部のデータの位置計算を大量に実行するとパフォーマンスがわるくなるみたいですね。


Audioタグをやめた件。
もともとplayerの部分はaudioタグのnative controlをつかって表示させていたのですが、これもsenchaとの相性があまり良くないみたいです。パネルのスライド移動を取り入れたところ、スライド移動中に全く関係ないところに一瞬ワープしたり、pickerコンポーネントを出しているときに、pickerではなくaudioコントロールが動いたりしましたので、修正しました。
ボタンとスライダーと時間表示の3つだけの簡単なものですが、まぁ上出来な動作になっているかと思います。


setHtmlによるデータの書き直しをやめた件。
再生時間を表示させるために、panelのhtml要素としてデータを書き出していたのですが、これが他の要素(特にlistのところ)に悪影響を与えていたみたいです。
setHtmlでデータを書き直すと、変更するたびにコンポーネントの要素計算がはいるみたいで、動作に悪影響を与えてしまうという・・・
仕方ないので表示部をinputのtextに変更し、書き直しさせるようにしました。(input要素なら変更したときにhtmlの要素計算がはいらないみたいです。)


と、こんなことを駆使しつつ、音楽を簡単に持ち歩けるようなwebアプリを作りました。
やってみてわかったことは要素の表示変更はなるべくさけつつ、動作するように調整した方がパフォーマンスがあがるということですね。要はjavascriptよりcss使えと・・・

あーslideNavigation改良したいなぁ・・・やっちゃおうかなぁ・・・