端末かってきたー

 買ったのは、miniPadってヤツ。
 いわゆる中華パッド。

 昨今の情勢からすると、大して安くはないんだけどね。
 タブレット型が欲しかったのよ。
 国産だとタブレット型ないんだもん…。
 WiMAXルーターがあるから、キャリア契約は必要ないし。

 当初は、Bpad 702(¥12,800)というのを買う予定だったんだ。
 感圧式だけど、2.2で値段的にとってもリーズナブル!
 でも公式マーケットに対応してないので、却下。

 代わりに浮上したのが、miniPadとdroPad。

 どっちも静電式で、ちがいはAndroidバージョンと画面解像度。
 droPadは、Android 2.2、800×480。
 miniPadは、Android 2.3、800×600。
 開発ターゲットは2.2を想定してるんで、その点ではdroPadの方がよい。
 だけど、800×600の解像度は魅力。
 解像度違いのテスト環境にもいいしね。

 外見は、iPadマンマなdroPadに軍配があがる。
 miniPadはオール・プラスチックなもんで、かなりチープ。
 けどdroPadは、筋力トレーニングができそうなほど重い…。
 miniPadは素材が素材だけに、かなり軽い。
 droPadを持ったあとだと、羽毛布団のように感じる。(^_^;
 まぁ、ここらへんは善し悪し。
 miniPadは強度面が、かなり心配だから。
 ”零戦とムスタング”みたいなモンかね。
 爆発するかも…という点では同じだけど。(笑

 結局、解像度が決め手となって、miniPadに決定。
 家に帰って色々、イジくり回して気づいた。
 バイブレーションないじゃん… (´・ω・`)
 うかつ… orz
 でも、droPadもなかったような気が…。
 ひと回り小さいタイプはあったんで、このサイズだとないのがフツーなのかもしれない。
 う~~、店で気づけよ、オイラ… (´Д`;)



Posted in 雑記. Tags: , , . 端末かってきたー はコメントを受け付けていません。 »

スプライト表示コマンド

 スプライト表示のコマンドを追加して、画像表示が可能になったよ。
 ノベル・アプリとしては、これで必要最低限の状態。
 音関係を作ってプレ配布…といきたいトコだけど。
 VirrualBoxだと音が出ないんで、音関係に手が出せない…。
 そろそろ、実端末が欲しいなぁ…。

20110218

Posted in 雑記. スプライト表示コマンド はコメントを受け付けていません。 »

ノベル・モード

 設計変更が終わって、ノベルモードを整備してみたよ。

110209

 折り返し&禁則処理をJava任せにしてるから、タマに違和感が出るけど。
 まぁ、仕様ということで。(^_^;

 これでテキストだけなら見ていくことができた。
 続けてコマンドを整備していくよ!

Posted in 雑記. ノベル・モード はコメントを受け付けていません。 »

ゲームに適したLayout とは?

 プログラムは粘土をコネるがごとし。
 作ってるノベルアプリは、閉塞感がアチコチに見られるので、作り直しをしている最中。
 ちょうどいいので、「ゲームに適したLayout」について、復習してみよう。

※.Layout に関しては、↓コチラが詳しい
http://techbooster.jpn.org/tag/addview/

必須条件

 ”ゲーム”と一括りにしても、色々あるよね。
 だから、一般的なテレビゲーム・スタイルを前提とするよ。

 そこで必要な条件は、以下の2つだろうね。

	1. オブジェクトを重ねて表示する。
	2. 指定した位置に、オブジェクトを表示する。

 てっとり早く結論をいうと、そんなLayout はAndroid にはないんだ。

 条件・1に適合するのは、2つだけ。

	FrameLayout
	RelativeLayout

 でもこの2つとも、条件・2には適合しないんだ。
 なぜならどちらのLayout も、他オブジェクトとの相関関係やLayout の制約に縛られてしまう…。

 2つの条件を兼ね備えているのは、AbsoluteLayout だけ。
 でも、これは現在、非推奨で、eclipse で取り消し線を引かれちゃう、いらない子扱い。(w


「ボタン等のインターフェースは、Layout に従うこと。
 画像表示だけなら、View内で行え」

 おそらくAndroid はこういう理念なんだろね。
 まぁ、それはわかるし、その方が便利なこともある。
 必ずボタンは重ならず、整然と並ぶからね。
 でもさ、それじゃ困ることもあるんだよね。

 たとえばImageView をスプライトのように使う場合。
 リアルタイムにこだわらない、アドベンチャー・ゲームのようなのは、ImageView で十分。
 背景やキャラを複数のImageView で構成すれば、お手軽だし、Animation の恩恵も受けられるしね。
 AbsoluteLayout みたいなのがない現状、ゲームに適したLayout はAndroid に存在しない。
 困ったモンだ。

View を重ねて表示したい

 View を重ねて表示したい場合、FrameLayout、RelativeLayout のどちらかを使うことになる。
 それぞれの概略はこんな感じ。

●FrameLayout
 ・単純に重ねて、View を配置する。
 ・表示原点は、左上。
 ・Gravity 設定が特殊で、foregroundGravity を使う。

●RelativeLayout
 ・他Viewとの相関関係で配置する。
  宝の在り処を記すみたいでややっこしいらしい。
  「大きな木から右に三歩、そこから下って四歩、そこから左に二歩…」
  みたいな感じらしい。(^_^;
 ・配置設定をしなければ、Viewを重ねられる。
  けれど、設定をすると重ね合わせはできなくなるみたい。
 ・Gravity 設定は、他と同様のgravity を使う。

 一見すると、FrameLayout がよさげ。
 だけどpadding がなんかおかしいんだよね…。
 使ってると、なんのために存在するのか、わからなくなってくる。(^_^;

 どちらも似たりよったり、RelativeLayout を使うのが無難…
 っていうのが、今のところの印象かな。

指定した位置にView を表示したい

 最初に”できない” といったけど、実はできないことはないんだ。
 ただ色々と問題があるだけ。
 で、やってみたことと、問題をあげておくよ。

Animation を使う

 Animation を使って位置を指定する方法。

 TranslateAnimation で位置を設定して、setDuration を”0″ にする。
 そうすると、瞬間的に移動するから。
 setFillAfter とsetFillEnabled を設定して、移動後の状態を維持するようにする。

 肝心なのは、setFillAfter とsetFillEnabled の設定だけで、TranslateAnimation はフツウに移動してもいいんだけどね。

 問題は、View がボタン等のインターフェースだった場合。
 View の実体は元の位置にあるので、移動後の場所をクリックしても、実行されない。
 まぁ、インターフェースにこんな使い方をすることはないだろうけどね。(^_^;

padding を使う

 padding を使って位置を指定する方法。

 この方法だと、インターフェースの反応を維持しながら指定できる。
 ただし、ややっこしいんだよねぇ。
 Layout によっては意図した状態にならないし…。(^_^;

 ※.setPadding の引数
http://android.migimaki.com/category/view/padding

 と、まぁ、そんなこんなで、ない知恵を絞ってみたよ。
 もっと簡単でいい方法があったら、また追加していくつもり。

Posted in レイアウト, 雑記. Tags: , , , , , . ゲームに適したLayout とは? はコメントを受け付けていません。 »

体を成した、ところで…

 作ってるノベルアプリ。
 ファイル選択、動作設定の後、再生…
 順次テキストを読み込み、表示させているので、ノベルアプリとしては体を成した、といったところ。
 あとは絵と音を出せば、だいたいできあがり…といった感じだね。

 で、ここまできて全体を眺めてみると、なんともイビツな印象。プログラム的にね。
 xmlとJavaソースの連携、Layout への理解を深めると、いかにAndroid風でない構成かがわかる。組むのに苦労するワケだ。
 習得しながら、構成ヒネって、押し込んだんだから、仕方ないやね。(^_^;
 ……でも、作り直したい…。(-_-;

 まぁ、作り直しは我慢して。
 絵を出すところまでやってみよう。
 音は…VirtualBox だと出ないんだなぁ…。実端末入手するまで保留かね。

 で。必要となる、zip周りを作成開始なのである。

Posted in 雑記. 体を成した、ところで… はコメントを受け付けていません。 »

TextView のredraw

 いろいろとイジくっていたら、TextView が正常表示されなくなった。
 部分的に欠けた表示になるんだ。
 再描画させればいいことはわかるんだけど、その方法がわからない…。
 で、getText してsetText したら、うまいこといったよ。

	setText( (String) getText() );

TextView の再帰ループ

 いま作ってるプログラムでは、TextView を二枚使ってる。
 ひとつはメッセージ表示。
 もうひとつはデバッグ・モニター。

 それでメッセージ側に、タッチを即すアイコンを出しているんだけど…。
 これまた、ひょんなことから表示されなくなってしまったんだ。
 原因を調べていたら、デバッグ・モニターも表示されなくなってたのに気づいた。
 こっちは単純な表示フラグの問題だったんで、直したところ、なんとアイコンも表示されるようになったんだ。
 どうやら、デバッグ・モニターの再描画を、メッセージ側も拾っていたらしい…。
 Σ そんなん、アリですか?! (笑

 でも、デバッグ・モニター側でのsetText って、onDraw の中でしかやってないんだよね。
 ふしぎ…
 って、まてまて。
 ということは、↓ってことだよ。

 onDraw → setText →onDraw →setText →…

 どう見ても、再帰ルーチン。
 つまり、スレッドなしで、安全な描画ループができるってことだよ。
 これはまた、妙な技を見つけてしまった…。

by the way…

 TextView なのに定期描画されてるの、なんか、おかしいと思ってたんだ。(笑

Posted in 裏技, 雑記. Tags: . TextView のredraw はコメントを受け付けていません。 »

TextViewはスクロールできません…

 表示するテキストが表示枠からはみ出したら、スクロールバーを出そう。
 そう思って調べてみると…
 TextViewはスクロールできません…
 どうやらスクロールさせるためには、ScrollView を使わなきゃならないらしい。

 ScrollViewは、ViewGroup の一種らしい。
 おそらく一種の窓みたいなもので、傘下のView の表示位置を変えて、スクロールさせるんだろうね。
 昔、そんなのを作ったよ…。

 つまりやるには、メッセージ表示のTextView を、ScrollView の傘下に配置しなきゃいけない。
 構造変更しなきゃならないよ… orz

 クリックでのメッセージ送りもあるし、今回は見送るか。

Posted in View, 雑記. Tags: , . TextViewはスクロールできません… はコメントを受け付けていません。 »

スレッドから別オブジェクトを触ると異常終了?! 解決編

 先日の「スレッドからオブジェクトをイジると異常終了する」件。
 2つの方法で解決した。

 おそらくは邪道な方法だと思うので、参考ぐらいにとどめた方がいいと思う。(^_^;

 前提となる、アプリの構造は以下のような感じだ。

	Activity
	  └GameRun (スレッド)
	     └TextView

※.この他にも、TextView と同列のView があるのだが、ここでは省略。

【動作】
 GameRun がスレッドとして動作し、表示メッセージをTextView へ送る。

【問題】
 GameRunスレッドから、setText や class変数の変更など、TextViewの操作を行うと異常終了する。

 解決するには、Handler を使用するしかないようだ。
 ただそれには不都合があり、今回は、別の方法を探ってみた。

リスナーを使う

 Handler ときて、最初に連想したのがこの方法だ。
 リスナーも通知先をハンドラという。
 ならば、リスナー経由で操作を行えば、根本の原因を回避できるのではないか?
 というワケ。

	GameRun
	 ↓ 通知 ( _Listener.setPadding( padding[] ); )
	TextView
	  method が実行され、変数に値が格納される。
	   setPadding( padding[] ){
	      mesPadding = padding;
	   }

 ただしこの方法は、必ずmethod を介さなければならない。
 上記の例でいえば、スレッドを使わない場合、次のようにシンプルだ。

	TextView.mesPadding = padding;

 ただの代入でも、method を介さなければならないのは、ちょいとシャク。
 ただそれだけの話ではあるんだけどね。

 この方法はことのほか、すんなり問題を解決した。
 ソースもすっきりシンプル。
 値を返すようなものにも使用できる。

リスナー と Handler を使う

 前記方法で問題は解決したように見えたが、別の箇所で再び同じ問題が起きた。
 そこではsetTextやLayoutView のremove を使っており、前記方法では解決されなかったのだ。
 おそらく、描画しているものに対して、直接操作を行おうとしたからだろう。

 解決策としてまず思い浮かんだのが、タイマーである。
 タイマーはキューを受けると、時間をおいて処理を実行する仕掛け。
 View側であらかじめ、setTextやremoveするようなタイマーを作り、スレッド側はキューを送る。
 処理の実行はView側なので、根本原因は回避できるハズだ。
 ……って、待て待て。
 それって、Handler そのものなんじゃね? (^_^;

 そこでView のmethod にHandler を仕掛け、↓のように改良してみた。
 結果は成功である。

View側 method

	private Handler mHandler = new Handler();
	private String mesStr = "";

	public void setMes( String mes ){
		mesStr = mes;
		mHandler.post( new Runnable() {
			public void run() {
				setText( mesStr );
			}
		});
		
	}

スレッド側 method実行

	_MesView.setMes( "うふふ……" );

 View側で、引数 mes を、class変数 mesStr に一旦代入しているのは、そうしないとrun内で認識されないから。(シンタックス・エラーになる)
 というのも、new Runnable() で暗黙的にThread を生成しているからだ。
 つまりrun内は、別class または別method の領域となってしまうのだね。
 それはわかるが、イマイチ好きになれない書き方…。
 まぁ、是非もナシやね。

 これで問題は解決し、もうひとつの問題が発生した。
 先のsetText をappend にした場合である。

	public void appendMes( String mes ){
		mesStr = mes;
		mHandler.post( new Runnable() {
			public void run() {
				append( mesStr );
			}
		});
	}

 append は現在表示しているText に文字列を追加するmethodである。
 たとえば、こんな動作をする。

	[ソース]
	setText( "うふふ……" );
	append( "えっち♪" );

	[表示動作]
	うふふ……
	 ↓append
	うふふ……えっち♪

 ソースからすると、上記のような動作になるハズなのだが。
 実際にやってみると…こうなってしまう。

	うふふ……
	 ↓append
	えっち♪えっち♪

 これはclass変数を介しているために起きてしまう現象だ。
 普段、意識しないが、Javaでの変数は参照が基本。
 内部的にsetText されたのは、class変数のメモリー位置で、class変数の内容が変われば、当然、変わってしまう…。
 おそらくは、スレッドを介しているのも関係があるんだろうね。

 そこでappend は使わず、自前で追加するように変更した。
 これで意図どおりに実行されるようになった。

	public void appendMes( String mes ){
		mesStr = mesStr+mes;
		mHandler.post( new Runnable() {
			public void run() {
				setText( mesStr );
			}
		});
	}

 以上の方法には、リスナーのみの時とは、異なる注意点がある。

1. 即応性がない。
 実行タイミングは、Handler(Looper) 任せなので、いつ実行されるか不明だ。
 付随して、返り値を求めるようなmethod には適応できない。

2. classローカルでも、Handler を介することになる。
 たとえば、例にあげたTextView自身がsetMesを実行すると、Handler を介した実行になる。
 なんだか、自分の尻を他人に拭いてもらうようで、まどろっこしい。(笑
 また、即応性の面からすると、潜在的なバグとなる可能性もある。
 必要なら、ローカル用とHandler用、別々のmethod を作った方がいいだろうね。

3. class変数で引数を保持する。
 先の失敗例のように、Handler が実行する前に、値が変わってしまわないようにしなければならない。

by the way

 setTextは、スレッドからの実行で、ちゃんと動作している場合と、異常終了する場合が見られた。
 これはsetTextだけの話ではない。
 おそらく動作する例は、その時はまだ画面に表示されていないか、UIがひとつだけの状態だったのが原因ではないかと思う。
 一度だけの実行で、不具合ナシと、安心してはいけないね。

補足

 Handler の使い方は、まだよく把握していない。
 見よう見まねの試行錯誤で、「一応、動作している」にすぎない。
 もっとうまく、正しい方法もあると思う。
 ちゃんとした解説を見て、試して、よく理解する必要があるね。(^_^;

 しかし…。
 なんだかJavaというより、Cocoaって感じの構造になったな。(w

Posted in Listener, 雑記. Tags: , , , . スレッドから別オブジェクトを触ると異常終了?! 解決編 はコメントを受け付けていません。 »

スレッドから別オブジェクトを触ると異常終了?!

 作成中のアプリに、SelectMenuを組み込んでみたところ、異常終了するようになってしまった。
 どうも、スレッドから別オブジェクトのView(UI系)に触ってはいけない決まりらしい。

 色々と調べてみたところ、その理由はスレッド間の同期にあるようだ。
 簡単にいうと、「個々に動いているスレッドで、勝手にイジくりまわされちゃかなわん」。
 まぁ、その理屈はわかるけどね。
 でも、コッチで作った変数に触っただけで、落ちる軟弱構造はどうよ?!

 それはそれとして。
 スレッドからの操作を行うための方法はあって、それがHandler らしい。
 Handler がスレッドからの通知を受け取り、溜まった通知を順番にLooper が実行していく…。
 そんな構造のようだね。
 なるほどねぇ。
 でも、ルーピーはイヤなネーミングだなぁ。オイラ、麻生支持者だし。(w

 対処方はわかったんで、試しにやってみたんだけど…。
 やってみると、問題が色々とでてくる。
 まず、変数が使えない。
 Handler はclass の中にclass を書くような記述のため、method 内で作った変数は参照できないみたいだ。(シンタックス・エラーになる)
 しかも、うまく動かない。
 なんか、Activity ともからんでいるようで、今の構造だとちと無理なようだ。
 どうもオイラの組み方は、とことん、Android と相性がわるいらしい。(w

 しかしこの、”class の中にclass がある” 書き方ってどうにかならんかね?
 ソースが見た目、すっきりしないし。
 iアプリやってたせいか、class をボロボロ作るのはどうもねぇ…。
 容量ケチりたがる貧乏性なだけだが。(笑

 まぁ、グチクヂいっててもはじまらない。
 Handler はスレッドを扱うゲームからすると、洗礼のようなもののようだし。
 どうにか対処を考えよう。

 こんな感じで対処してみたよ。

Posted in 雑記. Tags: , . スレッドから別オブジェクトを触ると異常終了?! はコメントを受け付けていません。 »

Viewを重ねるのがAndroid流…?

 たしかイスラムには、こんな言葉があったと思う。
「コーランの全てを理解しようと思ってはならない。
 それが必要とされる時に、真実は目の前に開かれるものだ」
 つまり “すぐに理解できなくても、繰り返し読めば、ひょんな拍子で理解できる時がくる。”と。
 そんなような言葉がカバラにもあった気がする…。

 FrameLayoutのリファレンスを眺めていて、あるmethodが目に留まった。
 onTouchEvent(MotionEvent event) とか、 scrollBy(int x, int y)とか、draw()とか…。
 View classの特徴そのまま。
 いやいや。なんのことはない。
 親class がViewなのだから、継承したmethod が使えて不思議はない。
 Viewのグループ化、レイアウトだけの機能かと思っていたが、これも勘違い。
 つまりFrameLayout も、れっきとしたView の一種なのである。

 なるほど。
 つまるところ、画像表示のSurfaceViewも、ListViewも、ボタンも、すべてViewの一種である。
 してみると。Android の画面は、部品であるいくつものViewを、多層に重ね合わせることで構成しているのだ。
 例えるなら、セル画やフォトショップのレイヤー。
 一枚のスクリーン(Canvas) に、全てを描いていた身からするとかなりリッチ。ちょっとした驚きである。

 Viewを重ねるのがAndroid流。
 なら、設計方針もそれに習うことにしよう。
// まぁ、元々、そういうつもりではいたんだけどね。(w

Posted in 雑記. Tags: , . Viewを重ねるのがAndroid流…? はコメントを受け付けていません。 »