2010年2月25日木曜日

Android multi screen 対応

Android にはいろんな端末があるので、解像度もさまざま。
QVGA, HVGA, WVGA, など

HT-03A は HVGA, tatto は QVGA, Nexus One は WVGA です。

で、sdk version 4 からは、
multi screen 対応を manifest に書かないと
マーケットに出てこなかったりします。

ということで、以下を manifest に書けばOKです。

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4 " />
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />



・anyDensity について

名前のとおり、これが true ということは、「any density = すべての解像度にコード側で(自分で)対応するなり、layoutフォルダを画面サイズごとに用意するなり、drawable フォルダを解像度ごとに用意するなりしていますよ」という意味です。

なので、Layoutparams や setTextSize などコードで指定した pixel size がそのまま表示されます。setWidth(10) は 10px で表示されます。つまり、解像度の高い端末の方が低い端末よりも小さく表示されます。

ただし、XMLの方で dp や sp で指定すると解像度が異なる端末でも同じ表示になるはずです。
つまり、コード側で setWidth(10) とした場合と、XMLで android:layout_width="10dip" とした場合の大きさは端末によって違います。
160 dpi の画面で 1 dip = 1 px なので、160 dpi の端末なら、同じ大きさになるということです。

一方、「anyDensity = false というのは、そいういう対処をしていないので、コード側で設定しているピクセル値を解像度に応じて調整してください」ということです。 この場合、コード側で setWidth(10) とした場合と XMLで android:layout_width="10dip"とした場合の大きさは端末の解像度によらず同じになります。

ただし、Xperia では anyDensity = false にすると、drawable-hdpi ではなく drawable-mdpi に格納した画像が使われるという問題があります。

ということで、私は anyDensity = true にして、XML側で sp や dip でサイズ指定し、コード側で指定しなければならない場合は、XMLで dimension を設定して、それを getDimension してsetWidth などに渡しています。

 

wma を mp3 に変換

wma の音声ファイルを mp3 に変更するっす。

ここを参考にしました。
http://vikslinuxtips.blogspot.com/2007/08/wma-mp3.html
ありがとうございます。
ただし、mplayer の引数の形式がちょっと変わってました。

私の環境ではこんな感じでできました。

> mplayer hoge.wma -ao pcm:file=hoge.wav
> lame hoge.wav hoge.mp3