2011年5月28日土曜日

[Android] 画面の向きを設定するには

How to change the orientation of the activity.

Androidのアプリケーション(Activity)は画面の向き(縦・横)を設定できます。
設定する方法はいくつかあります。

1.マニフェスト(AndroidManifest.xml)のandroid:screenOrientationに設定する
2.ActivityのsetRequestedOrientationで設定する

今回は「2.ActivityのsetRequestedOrientationで設定する」の方法で画面の向きを自由に変更するアプリケーションを作ってみます。

(パーミッションは不要なのでマニフェストは省略します)
レイアウト(main.xml)

Activity(Main.java)
(1)縦レイアウトに固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
端末を横に向けても縦レイアウトを維持します。

(2)横レイアウトに固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
端末を縦に向けても横レイアウトを維持します。

(3)端末の向きに連動
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
端末の向きに合わせて自動的に画面の向きが変わります。初期状態です。

(4)現在の画面の向きを知る
getResources().getConfiguration().orientation
を参照します。
(参考:[Android] 画面の回転に反応するウィジットアプリケーションを作るには #2
このソースはActivity起動時の画面の向きを設定しています。
setRequestedOrientation(getResources().getConfiguration().orientation)
Activity起動時に縦レイアウトなら横にしても縦レイアウトのままです。

※注意事項
Androidは画面の向きが変わるたびに[Intent.ACTION_CONFIGURATION_CHANGED]をブロードキャストします。
バックグランドでこのブロードキャストを受け取るたびに何らかの処理をするアプリケーションがたくさんあると思います。
ブロードキャストを発信するアプリケーションは、他のアプリケーションに影響を与えることがあるかもしれません。
また、Activityの向きが変わるたびにonConfigurationChangedメソッドが呼ばれます。onConfigurationChangedメソッドで画面の向きを設定するコードを書くと無限ループします。

auのAQUOS PHONE IS11SHは縦レイアウトで使う機会が多いと思いますが、REGZA Phone IS11Tは横レイアウトで使う機会が多そうです。
画面の向きは固定させずに端末の向きあわせてレイアウトを対応させるのが無難だと思います。


以上、参考になれば幸いです。

2011年5月21日土曜日

[Android] OpenGL ESで文字を表示する

How to draw text on GLSurfaceView

AndroidのOpenGL ESには画面に文字を表示するAPIが無いようです。
いくつかのソースを調べたところ、文字を表示するために次のような2種類の方法がありました。

1.文字の形のポリゴンを表示する
2.文字を書いたビットマップ画像をテクスチャとして表示する

「1.文字の形のポリゴンを表示する」方法は、文字の種類や画数の多い日本語の表示には手間が多すぎます。
「2.文字を書いたビットマップ画像をテクスチャにする」のサンプルを作ってみます。
あらかじめ文字を書いたビットマップ画像を用意するのではなく、ビットマップ画像を動的に生成します。
注意するべき点はテクスチャに表示するビットマップ画像のサイズを2の累乗に設定することです。
例:128ピクセル×64ピクセル、512ピクセル×512ピクセル、など
このサイズを守らなくてもテクスチャ表示できる機種とできない機種があります。Android SDKのエミュレーターでは表示できてしまいますが、ほとんどの機種では表示できないと思います。
エミュレーターではテクスチャ表示できるのに実機では表示できない場合は画像のサイズが原因かもしれません。
テクスチャ表示するアプリは複数の機種で動作確認することをお勧めします。

GlSurfaceViewに現在時刻の文字を表示するサンプルソースです。
パーミッションは設定不要のためマニフェストは省略します。レイアウト用xmlも使いません。
(2011年5月30日訂正、20011年8月2日訂正)
ポリゴンらしく回転させてます。1分ごとに1回転します。
※画像や文字を回転させるだけならSurfaceViewでもできます。文字を回転させても読みにくいだけです。
ビットマップ画像の作成(動的ビットマップ画像)は負荷が高いらしく、あまり短い間隔でビットマップ画像を作成するとLow Memoryの警告がたくさん出たあげく強制終了することがありした。
対策として1秒に1回だけビットマップ画像を作成することにしました。

GLSurfaceView#onDrawFrameメソッド内でのメモリーの確保や解放は極力避けた方がいいようです。(StringではなくStringBufferを使っているのもそのため)
負荷軽減のためにはあらかじめ文字を描いた画像(静的ビットマップ画像)を表示する方がいいと思います。

OpenGLは機種ごとの動作の違いがはっきり現れるので実機テストが欠かせません。

以上、参考になれば幸いです。

キーワード
GLSurfaceView Renderer createBitmap Canvas Panit

2011年5月14日土曜日

[Android] VmWare PlayerでAndroidをデバッグする

How to install Android OS on VMwarePlayer

開発環境のAndroid-SDKにはAndroid OSのエミュレーターが付属しています。これはARMでAndroidを稼働させるエミュレーターです。
AndroidはARM用だけではなく、x86用のディストリビューションも公開されています。
x86用Androidのデバッグ環境を用意するためにVMware Playerを使ってみます。
この先はWindowsにEclipseとAndroid-SDKがセットアップされている状態での手順です。

1.VMware Playerのダウンロードとインストール

https://www.vmware.com/jp/tryvmware/?p=player&lp=1
氏名とメールアドレスを入力するとアクティベーションのURLへのリンクが書かれたメールが届くのでリンク先からダウンロードします。
インストール後は再起動が必要です。

2.x86用Androidのダウンロード

http://www.android-x86.org/download
2011年5月時点ではandroid-x86-2.2-generic.isoが最新の安定版のようです。

3.VMwareの仮想マシンにx86用Androidのインストール

Live CDとして起動すると設定情報が保存されないのでインストールします。
VMware Playerを起動し、
新規仮想マシンの作成 をクリックし(1)
インストーラディスクイメージファイル に2.でダウンロードしたandroid-x86-2.2-generic.isoを指定します。(2)
次へをクリックします。(3)
blog.fujiu.jp VmWare PlayerでAndroidをデバッグする

仮想マシン名にわかりやすい名前を入力して次へをクリックします。
以降のウィザード画面の設定項目はすべて初期値のままで進めました。

この先は仮想マシンを操作します。
仮想マシンの操作中は他のアプリケーションを操作できません。他のアプリケーションを操作するときはCtrlキーを押しながらAltキーを押して下さい。

ウィザード画面の最後に完了をクリックするとメニュー画面が表示されます。カーソルキーの↑↓で
Installation - Install Android-x86 to harddisk
を選んでEnterキーを押します。

Create/Modifi partition と< OK >を選んでEnter

カーソルキーの←→で[New]を選んでEnter
(画像を省略します)
カーソルキーの←→で[Primary]を選んでEnter
sizeは初期値のままEnter
カーソルキーの←→で[Bootable]を選んでEnter(sda1の「Flags」にBootが表示される)
カーソルキーの←→で[Write]を選んでEnter
yesと入力してEnter
最後にカーソルキーの←→で[Quit]を選んでEnter

ここまで操作するとパーティション選択画面にsda1ができています。
sda1と< OK >を選択しEnter
file system画面では、ext3と< OK >を選択しEnter
次の画面で< Yes >を選択しEnter
次の画面も< Yes >を選択しEnter

最後の画面ですが、デバッグ目的なので< Yes >を選択しました。

これで完了です。Enterを押せばAndroidが起動します。

4.WMwareでAndroidを起動

インストール後の起動画面はこうなります。Enterキーを押せばAndroidが起動します。

android-x86-2.2-genericはマウスをサポートしているのでタッチパネルが無くてもほとんどの操作が可能です。タイムゾーンや言語を日本に設定します。谷歌拼音输入法は不安定なのでオフにしました。

主な操作方法(PC側のキーとAndroidの動作)
Escキー → 戻るボタン
右のCtrlキーの隣にあるメニュー(?)キー → Menuボタン
Homeキー → Homeボタン
Endキー → 電源ボタン
Altキー + F1キー → コンソールに切り替える
Altキー + F7キー → コンソールから復帰する
通話履歴 → F3キー


5.Android SDKと接続

VMwareでAndroidを起動させただけではAndroid SDKでデバッグできません。
devices欄が空っぽです。

AndroidのIPアドレスを調べます。
Altキーを押しながらF1キーを押してコンソールに切り替えます。
コンソールで
ifconfig eth0
を実行するとIPアドレスが表示されるのでメモします。
このAndroidのIPアドレスは 192.168.6.129 でした。
元の画面に戻るにはAltキーを押しながらF7キーを押します。

コマンドプロンプトからAndroid SDKのadb.exeを使います。
adb.exeはAndroid SDKを解凍したフォルダーのplatform-toolsにあります。
Android SDKを D:\android-sdk-windows にインストールしたとすると
D:\android-sdk-windows\platform-tools\adb connect 192.168.6.129:5555
と入力します。(connect の後のIPアドレスは前の手順で調べた値です)

devicesが追加されればOKです。
これで自作アプリケーションをインストールしてデバッグに使えます。

先日、LifeTouch NOTEを見に行ったらその隣でネットブック(Windows7 Starter)がLifeTouch NOTEの半分くらいの価格で販売されてました。
ネットブックにx86用Androidをインストールしてみるのもおもしろそうです。
ただし
・android-x86-2.2-genericはAndroid Marketが使えない
・ネットブックにはタッチパネル・GPS・ジャイロセンサーなどがない
・Androidはプリンターなどの周辺機器をサポートしてない
などの覚悟が必要です。


関連ブログ

VirtualBoxにCentOS7.0をインストール


以上、参考になれば幸いです。

2011年5月7日土曜日

[Java] thisとは

What is "this"

Javaには「this」というキーワードがあります。Javaで書かれたAndroidアプリのソースにも頻繁に登場します。

thisはインスタンス化されたクラスの自分自信を指します。
「this.」の後にクラスのメンバー変数やメソッドを書くことができるし省略することもできます。
staticなメンバーやメソッドはインスタンス化されないのでthisをつけて書くことはできません。

以下は説明のためのサンプルソースです。
Activity(Sample1.java) このサンプルでは(1)と(2)がthisをつける例です。
(3)はstaticなのでthisではなく自分のクラス名をつける例です。
このソースの(1)と(2)のthisと(3)の自分のクラス名は省略可能です。

変数名が競合する場合はthisを省略できません。
次のサンプルはthisやクラス名を省略できないケースです。
Activity(Sample2.java) Sample2のフィールドメンバー(1)(2)と、onCreateメソッドのローカル変数(3)(4)にそれぞれ「a」「b」という変数があります。
この場合、thisをつけた「a」は(1)が、つけない「a」は(3)が使われます。
クラス名をつけた「b」は(2)が、つけない「b」は(4)が使われます。
このサンプルはthisの省略ができないことを示すだけで、紛らわしい変数名を区別するためにthisを使うべきではありません。

ただしアクセサー(setter)では敢えて同じ変数名を使ってthisで区別する人もいます。

Eclipseを使っていれば、「this.」と入力するとそのクラスのフィールドやメソッドの一覧が表示されます。省略可能でも敢えて省略しない人も多いと思います。
「this.」を入力しなくてもCtrlキーを押しながらスペースキーを押しても同じことができます。

省略可能なthisを書くべきか、略すべきか
書いても書かなくても実行時のパフォーマンスに影響はないのでどっちでもいいと思います。読みやすいソースコードを書くことが大事だと思います。

以上、参考になれば幸いです。
[Java] thisとは #2 も公開しました

2011年5月5日木曜日

Eye元気!がAndroWireに掲載

Eye元気!がAndroWireに掲載されました。
http://android.journal.mycom.co.jp/apps/jp.fujiu.AndroidApp.EyeGenki/Eye%E5%85%83%E6%B0%97%EF%BC%81/
マイコミジャーナル様、ありがとうございます!