drawable-hdpiが表示されない

androidでは、違う解像度を持つ端末で画像を綺麗に表示させるための仕組み、用意されています。そのことは、もちろん知っていたのでが、今回は初めてのアプリの開発でもあり、HVGAのemulatorでずっと開発テストしてきました。そして、開発がひと段落したので、イザ、他の端末用に画像を作成して、WVGAで表示させようとしたのですが、これがうまくいきませんでした。

drawable-hdpiに画像を入れれば、いいだけでしょ!?
これが、今日今朝の考え。
それがうまくいかなかったので、少し調べて、

をmanifest.xmlに追加した。
まだ、画像が読み込まれていない。

結局2時間、くらい調べた。途中、databaseのclose()しわすれバグを発見し、このエラーが影響しているのか、とかへんな方向に行きかけた、時、このページを発見した。http://wavetalker.blog134.fc2.com/blog-entry-52.html    

上のリンクの抜粋

1./res/drawable
よくAndroidアプリ開発時に画像リソースを「/res/drawable」に配置している例を見かけるがこれは良くない。
/res/drawableに配置した場合、端末本来の解像度に関係なく、中解像度(mdpi)に対応する画像だと見なされ
Androidのプラットフォームが自動的に拡大/縮小(pre-scaling)してしまい、意図した表示が行えないケースがある。
例えば、端末本来の解像度が高解像度(hdpi)の場合で、画像の配置が/res/drawableだと画像が1.5倍に拡大されて
しまい、表示がぼやけたりする。

例)端末の解像度が高解像度(hdpi)の場合
/res-drawable
└icon.ping(10px×10px) ← この画像をロード(mdpiとしてロード)
/res-drawable-hdpi
└ファイルなし ← 画像を探すがファイルがない
/res-drawable-mdpi
└ファイルなし
/res-drawable-ldpi
└ファイルなし

結果、pre-scalingが働き、15px×15pxの画像がディスプレイ表示される。


このようなケースを避ける場合は、以下の2つの場所の何れかに画像ファイルを配置する事でpre-scalingを
回避することが出来る。

/res-drawable-hdpi(端末毎の解像度の場所)
/res/drawable-nodpi

「/res/drawable-nodpi」に配置した場合は、端末の解像度に関係なく自動的にスケーリングされないようになる。
地図のピン等、特に端末により表示サイズの変更が必要ない程、小さい画像に関しては、こちらのディレクトリに
配置する場合もある。
上の例とは逆に解像度後との場所に画像を配置している場合で、配置場所よりも実際の端末解像度が小さい場合は、縮小表示される。
縮小の場合は拡大のように画像がぼやけたりはしないが、実際の表示を確認した上で、どの場所に画像を配置するか、
もしくは複数画像を用意するかは検討したほうが良い。

/res-drawableフォルダには解像度毎のフォルダ以外にAPILevel毎に画像を切り替えるフォルダ等、実は色々ある。

■Supporting Multiple Screens - Resource directory qualifiers for screen size and density
http://developer.android.com/guide/practices/screens_support.html#qualifiers


2.android:anyDensity
android:anyDensityの初期値(その他もあるが)がminSdkVersion、またはtargetSdkVersionの値による異なる。
何れかが「4」以下の場合は、android:anyDensity=falseが初期値となりこれまた中解像度(mdpi)を基準に
実解像度にした場合のピクセルサイズを自動的に計算し拡大/縮小(auto-scaling)してします。
ケースとしては、実際の端末サイズが高解像度(hdpi)にも関わらず、android:anyDensity=falseとなっており
中解像度を基準に拡大表示(1.5倍)してしまい、GoogleMapの表示がぼやけたりする。

■Supporting Multiple Screens - Manifest attributes for screens support
http://developer.android.com/guide/practices/screens_support.html#attrs

このような事象を回避する場合は、Manifest.xmlで以下のように要素を定義し
明示的に「android:anyDensity="true"」と記述する。

----


何気にマルチスクリーン対応は奥が深い。しかし、現在殆どの端末が高解像度なので、基準が中解像度なのは微妙な気がした。
おかげで現場で表示がぼやけるケースが続出。

見事!表示された!