2012年11月27日火曜日

[Titanium1日目]JSSとかエラーとかLabelとか #TitaniumJP


実際には1日目ではないんですが、更新スタートということで…w

○JSSのバグ

JSSを導入して見た目をiPhoneとandroidで異なるようにしようと思ったら、何度ビルドしてもうまく反映されない。
調べてみると、どうもバグみたいですね。

JSSは変更を保存してもビルド時に反映されない場合があります.
(反映されている時もある.不安定.)
上で例に挙げたソースコードで説明すると, colorを’#000′から’#333′に変えて保存, 実行してもエミュレータ上で何も変わらない, といった現象です.
http://markovlabo.net/?p=901

おいおい。

こういうときは現在のProjectをCleanして再ビルドしましょう.
メニューバー>Project>Clean を選択.
http://markovlabo.net/?p=901

うーん、面倒。

さらに別のところでJSSが反映されない。
JSファイルでTi.Map.createViewのプロパティにid:'mapview'を記述。
JSSファイル
#mapview{
     width:320px;
     height:240px;
}
を記述しても、マップが画面の半分だけ表示にならず、下まで表示される…。

ここはもう普通にJSSを使わずにTi.Map.createViewのプロパティで解決することに。



○変なエラー

謎なのが毎回へんなエラーが出てエミュレータが起動しません。

[ERROR] Application Installer abnormal process termination. Process exit value was 1
[ERROR] Timed out waiting for emulator to be ready, you may need to close the emulator and try again

しかし前に作ったHelloWorldではエミュレータが起動する…なんでや。

まぁどっちみちエミュレータだとGPSのテストが出来ないからいいんだけどさ。
これも余裕のあるときに検証するかぁ。



○Androidで位置情報を取得する時に気をつけること

Titaniumで位置情報を取る方法は2つあります。
ひとつはgetCurrentPosition関数を使う方法。

Ti.Geolocation.getCurrentPosition(function(e) {
    var cLat = e.coords.latitude;
    var cLong = e.coords.longitude;
});
ただしこの方法だと一度しか取得してくれません。
ずっと取り続けてほしいときは、addEventListenerを使います。

Ti.Geolocation.addEventListener('location',function(e){
  var cLat = e.coords.latitude;
  var cLong = e.coords.longitude;
});
まぁ自分が知っていたのはこれまでなんですが、気になる記事を発見。

Androidアプリで位置情報を取得したい場合、通常AndroidManifest.xmlにuses-permission"ACCESS_FINE_LOCATION"を追加する必要があります。
ですが、Titanium MobileではgetCurrentPositionという関数名がソースコード内に含まれていれば自動でpermissionを追加するようになっており、Androidアプリ独自の部分をあまり意識しなくても済むようになっています。
しかし、addEventListenerを用いた方法だと、このpermissionの自動追加が適応されないため(中略)位置情報を取得できません。
http://tech-sketch.jp/2012/01/titanium-mobile.html

TiApp.xmlに追加しないといけない内容は元記事をお読みください。
これは盲点ですね…早速追加しときました。



○Labelってどう変更するのよ

とりあえず、Android実機を持ってちゃんと緯度と経度がはかれるかどうかを調べるために、緯度と経度をラベル表示させるようプログラムを組みます。

そこでぶつかったのが「Label内の値を変更するにはどうすればいいか」。
「そんなのも分からんのかい」と思ったそこのアナタ。そのくらいド素人なので許してください。

とりあえず書いたのが下のコード。
find.js

(前略)

var labelPos = Ti.UI.createLabel({
     text: 'hogehoge',
     height: 70,
     top: 280
});

win.add(labelPos);

Ti.Geolocation.addEventListener("location", function(e) {
     cLocLat = e.coords.latitude;
     cLocLong = e.coords.longitude;
     Ti.API.info(cLocLat);
     Ti.API.info(cLocLong);
     labelPos.text(cLocLat+'\n'+cLocLong);
});
(後略)

するとこんなエラーが。

'hogehoge' is not a function (evaluating 'labelPos.text(cLocLat+'\\n'+cLocLong)')

text()っていう関数は存在しないってこと?

とりあえず別の方法として、上の部分を

labelPos.text = cLocLat+'\n'+cLocLong ;

に変えるとすんなり通りました。

※ちなみにこのバグ、text()があると思い込んでたせいで修正するだけで1時間使ってます。なんで気づかなかったんや...(´・ω・`)



○その他雑多なメモ

改行は\nを使う。逆スラッシュのやつ。ここはJSでも一緒。""で囲むことを忘れずに。



○明日の予定

・Android実機でちゃんと継続的に位置情報がとれているかを確認。
・とれていれば2地点間の距離を計算するやつを書く。
・ついでにcloseを押したら位置情報を取るのをやめさせる方法も考える。
・時間があればデータベースまで…無理かな(´・ω・`)
・JSDeferredが分からん。
・GitとGitHubでバージョン管理をしたい。

2012年11月26日月曜日

はじめにお読みください

このブログについて

ここはワタクシ、ビスタがTitaniumMobileを使ってあれやこれや思案しているさまを、他のスーパープログラマーの方々に見ていただき、無事プログラムを完成させるためのブログです。

修了するには年内にプログラムを完成させなければなりません!
マジでヤバいんです(´・ω・`)

正直自分が助けてもらうために作っていますが、自分と同じような失敗にぶつかった人のために、情報をシェアできたらいいなとか思っています。

自分はTitaniumはもちろんJSも初心者なので、ある程度組める方には有益な情報が得られないかもしれません。

とりあえず、温かい目で見ててください、お願いします><

お前誰やねん

ビスタです。今年の11月30日で25歳になります。

某大学院でデザインを勉強しているはずなんですが、いつの間にかプログラムをすることになりました。

HTML、CSS、JS、PHP、Perlを色々触った結果、どれも半分くらい分かる程度になりました。

プログラム歴は浅いですがそれなりに頑張ってます。

作りたいプログラムの概要

全体的なこと

・Androidで動くもの(出来ればiPhone)→実機で動かせるのはAndroidのほうが楽だし。
・開発環境はMac OS X 10.7、サブでWindows7(Vistaじゃねーのかよ!とか言わない)
・Androidは基本実機で試すようにする。
・iOS端末はiPodTouch(第三世代)を所持。多分使わない。

アプリの流れ

・タイトル画面が表示され、ユーザーの現在地を検出する。
・ボタンを押すと現在地を取得し、そこから一定距離内(半径1kmを想定)にあるスポットをリスト表示
・ユーザーはそのリストの中から一つを選択し、移動を開始する。
・画面にはそのスポットと距離、方角が表示されている。
・スポットまでの距離が10m以内になったら「到着」ボタンを押し、到着フラグを立てる。

アプリのシステム用件(ToDo)

現在位置を移動しても取り続けなければならない!
・店舗・スポットのデータベースの制作
・データベースとの連携
・今いる場所から目的地までの距離と方角を計算
・(追加予定)

これでいまいちどんなものを作るかわからない方は直接僕に連絡して下さい。