2012年7月24日火曜日

【Titanium】AndroidとiPhoneの両対応に悩む

手持ちの環境はMacbookAirとTitaniumStudio2.1、iOS5.1、Android2.3.7でお送りしております。
朝時間を使って最近のまとめです。

ちまちまと小規模のアプリ制作に励んでいます。
目標は用途を限定した電卓的アプリ。

前回のchangeイベントの件は何をどうしたのか、いつの間にか解決しました。
多分、changeイベントで発生させていた計算処理が足をひっぱっていたんじゃないかと。

下みたいな事をしようとした時、

textFieldC.value = textFieldA.value / textFieldB.value;

iOSだと問題なく計算してくれるんですが、Androidだとエラーになるみたいで、
恐らく型変換をしないまま計算しようとしているのがダメなんですよね。

textFieldC.value = String(parseFloat(textFieldA.value) / parseFloat(textFieldB.value));

こんな感じにしたらエラーが出なくなりました。
他にもiPhoneとAndroidで同じ結果が得られなくて苦労する感じです。

割り切ってiPhoneのみとかで作っちゃった方が良いかなとも思いましたが、
それはそれでAndroidに手を出そうとしたときに苦労しそうだったのでがんばりたいです。
うーん、このあたりは同じWebkit系ブラウザで動作するのでCordovaは優秀でしたと今更ながらに。

あと、解像度の違いへの対応も面倒そう。
ピクセル指定だとAndroidとiPhoneのエミュレータ結果がだいぶ違うんですよね。当たり前なんですけど。
とりあえずは単位dpでの指定をする事で乗り切ろうかと思っています。
一番きれいに処理できるのはjssなのでしょうか。手間がかかりそうだったので今回は手を出さない事にしました。

2012年7月22日日曜日

【Titanium】Requireの子から親への連携

前回からの続き的な内容。
Requireの中にあるボタンで発生したイベントからいかにして親のオブジェクトに連携するか悩んでいましたが、
最適解かはわかりませんが、fireEventで解決させました。

exports.view = function(_viewNum){
    var view = Ti.UI.createView({});

    var button = Titanium.UI.createButton({
        title:’ボタン',
    });
    view.add(button);

    button.addEventListener('click', function(){
            view.fireEvent('newEvent');
    });

    return view;
}

これで親側にあるexports.viewに当たるオブジェクトにイベントを伝えられるので、
あとは親側のオブジェクトにnewEventをaddEventListenerすれば大丈夫。

最初、全部グローバルオブジェクト(?)として設定すれば解決するかと思ってたんですが、
それだとiPhoneだと動いてもAndroidだとダメみたいだったんであきらめました。
使い方としても本来のCommonJSの仕様から外れたものみたいですし・・・。

もっと簡単に作れるかなーと思ってましたが、なんだかんだで色々なところでひっかかりますね。
JavaScriptで簡単な制御以上の事をやった事がないからだと思いますが。

解決したと思ったら今度はTextFieldのchangeイベントを使おうとするとAndroidでエラーになってしまって困ってます。

2012年7月17日火曜日

【Titanium】シングルコンテキストに苦戦

手持ちの本に沿って、Includeで別ファイルを呼んでくるスタイルで多少わかってきたかな、と思ったら
TitaniumMobile2.0からはrequireで呼んでくるシングルコンテキストというスタイルが一般的である事を知りました。

あちこちのサイトをみて多少はわかったけど、まだまだわからない状況です。

こちらのサイト http://ti.imthinker.net/ あたりが比較的わかりやすかった印象。

元々わかってないところに飛び込んできた新情報なのでメリットもよく理解していませんが、
どうやら今はこっちの方法がスタンダードでパフォーマンス面でも優れているようなので
なんとかして覚えたいと思っています。

とりあえず、app.jsにこんな感じに書いて、

var app = {};
app.win = require("mainwin").win();

mainwin.jsにこんな感じに書いておくと、

exports.win = function (){
    var winX = Titanium.UI.createWindow({});
    winX.open();
    return winX;
};

app.winはmainwin.jsに書かれているwinXに成り代わる感じだっていう事まではなんとなく理解しました。
オブジェクトが別ファイルに分割されたという感じ。

app.winがmainwin.jsのwinを呼び出す

mainwin.jsの内容が呼ばれる。

mainwin.jsの関数内でwinXというウィンドウを作る(createWindow)

関数の結果としてwinXを返す(return winX)
exports(require”mainwin”).winはwinXである

app.winはexports(require”mainwin”).winであるので、つまりwinXである。

つながりを整理しようと思ったんですが、まだまだ理解不足ですね。
とりあえず動く状態にはもっていけるようになったんですが、require内に定義したaddEventListenerから
親のjsファイルのオブジェクトに結果を与える事がうまくできません。

どうしたらよいのかなぁ。

2012年7月9日月曜日

【Titanium】スペルミスで悩む

環境:TitaniumStudio2.1、第4世代iPodTouch(iOS5.1)

買った書籍のサンプルを一通り試し、できる事はわかったけど使いこなせてない、そんなラインまで来ました。
特定のものの計算に限定した電卓系アプリの作成にチャレンジしています。

電卓系アプリということでテキストボックスに数字しかいれられないようにしたいのですが、こんな感じ

var text1 = Ti.UI.createTextField({
    width:160,
    top:180,
    left:170,
    height:60,
   keybordType:Titanium.UI.KEYBOARD_NUMBER_PAD,
    borderStyle:Ti.UI.INPUT_BORDERSTYLE_ROUNDED
})

にしてみたんですが、うまくいかない。
どうしてだろうどうしてだろうと悩んでいたら・・・スペルミスでした(笑

正しくはkeyboardTypeですね。
この手のミスはエラーとして出てこないんですかね~。

続いての問題として一度出したキーボードをどうやって消すか、です。
Titanium.UI.KEYBOARD_NUMBER_PADの場合に確定するキーがでなかったのです。

2012年7月8日日曜日

車で龍泉洞へ

自転車で遠出しようかと思っていたが、残念なまでの雨だったので車での遠出。
雨でも影響のない洞窟なんて良いなと岩手の龍泉洞に行ってきた。
そうしてやってきた岩手は割と晴れてきた。
朝に出てきたのに、高速代をケチって一般道を走っていたら6時間くらいかかって昼過ぎになってしまった。
車の持ち主である友人も同行していたが、夜勤明けだったので自分が延々と運転。
DSCN1167 
以前行ったのは10年以上前になるのですごく新鮮に楽しめた!
DSCN1174 DSCN1184
龍泉洞近くの食事処で焼き鮎の定食食べたり。
お土産屋はいかにも地方のお土産屋って感じだったけど、こんな
https://gs825.ggsv.jp/~w825144/detail.php?n=6
クリアファイルが置いていて時代を感じる。
龍泉洞クリアファイルをネタで買おうと思ったけど残念ながら売り切れ。

車を自由に使えるのが1日だけだったのでその日のうちに帰りました。
帰りはある程度高速も使いつつ。
4年くらいは車を所有していたので早々下手にはならないと思うけど、年1くらいで運転しておくのはよいね。


2012年7月3日火曜日

TitaniumMobileでひっかかったとこメモ1

Mac+iPodtouch+TitaniumMobile2.1での環境です。
2があるかどうかわからないのに先走って1とナンバリングしておきます。

①'undefined' is not an object とかいうエラーがでる。
 本に載っている写真アプリを作ってる際に発生。該当行を見ても問題は無し。
 悩んだ挙句、検索をしてみたらこちらが出てきて解決。

 その通り、プロジェクトフォルダのbuild/iphone下位の内容をまるごと削除したら解消しました。
 そんなアホな!

②アプリ名を変更したい
 Resources/iphoneにInfoPlist.stringを作成。

 CFBundleDisplayName = "アプリ名";

 って感じの内容を書いてあげたら大丈夫でした。

③アプリアイコン(iPhone向)について
 Retina用のアイコンはResources/iphoneフォルダ内にappicon@2x.png(114x114)を入れるだけでOKです。
 また、iPhoneアプリのアイコン特有の光沢を入れたくない場合、tiapp.xmlを修正。

<prerendered-icon>false</prerendered-icon>

 という行があるはずなので、trueに修正すると元画像のまま表示されるようになります。

 

要らないところでひっかかってしまい、非常に進捗は良くないです。
でも少しづつTitaniumMobileのスタイルがわかってきました!

今の時点の知識で実現できそうなアプリの構想もぼんやりとながらできてきたり。
その前にリジェクトされたCordovaのアプリもなんとかしたい・・・。

【アプリをプレイ】動体視力のテスト

ランキングにあった動体視力のテストをプレイ。

右から次々に流れてくる「C」の開いている方向を視力検査の要領で答えていくゲーム。
徐々に流れる速度が速くなっていくので為、高得点には動体視力が求められるのが特徴、でしょうか。

正直、UIの造りが残念な感じで、最初どこを押して良いかわからなかったり、
開始時の画面方向キーの配置が何故かPCのような配列だったりする点がとても惜しいと思いました。

それでもシンプルなゲームシステムや、貯めたコインをアイテム(?)と交換できるやりこみ要素はやはり熱くなれるのでしょうかね。

2012年7月1日日曜日

IIJmio回線でradiko

インターネットでラジオが聞けるサービスのradiko、IIJmio128kでもなんとか聞くことができます。

難視聴地域でも聞けるようにするような目的からなのか、本来はその地域で流れている局しか聴くことができません。

自分は東北在住なんですが、IIJmioの回線使うと聞けちゃうんですよね。関東圏のラジオが。
Androidアプリのradikoからだと、GPSで地域を判定してるみたいなので地元の局しか聞けませんが、
テザリングで接続したPCのブラウザからは何故か関東圏のラジオが聞けました。

普段は自宅の無線LANから接続するので関係ないんですが、これって実際のところ何かの決まりに触れてしまうんですかね?

疑問を解決しないままにするこの日記。

TitaniumMobile勉強中

引き続きこちらの本を読みながら勉強中です。

 
やはりHTML5なCordovaからこちらを始めるとちょっとハードルは高いなぁという感じです。
UIデザインも全部コードとして書いていかないといけませんしね。
でも、自分みたいな初心者がひっかかりそうな箇所を説明してくれているので安心して読み進められます。

今はChapter5まで進めたところです。
小さなサンプルをこなす、というもの。
TitaniumMobileに限らずですが、なんとなくは理解してきたものの自分の頭で考えて作らないと身にはつかなそうです。

今のChapterを少し進めたら何か作って見たいと思います。