くまちゃんのiOS/Androidゲームプログラミング

マイペースでゲームつくってます。

Nexus7とNexus5のはざまで

今週はAndroidどっぷりでした。
ちょっとしたお仕事便利アプリを2本、周囲のAndroidユーザーに配ってみてはじめて気づいたのですが、SurfaceViewでBitmapを画像に使用した場合、端末が勝手に画像を拡大してしまう仕様だったんですね。
1年前に安さと機能で開発用端末としてNexus7(2013)を購入し、アプリ開発をしていたのですが、今回はじめてリアルNexus5やらXperiaZ3やら「タブレットではない携帯サイズ画面の端末」にアプリをインストールしてみるとビットマップ画像が1.5倍に拡大される端末やら2倍に拡大される端末やらが登場してわやくちゃでした。あ、イケてる端末もあるんですよね。

まったく予想していなかった事態にアセりまくってググりまくったのですが、結果、画像を格納するdrawableフォルダを気にせよ、とこれまたiOS開発者には予想もしていなかった仕様。Android Studioデフォルトではdrawableフォルダ1種類しか作られないのに、

「端末の解像度に応じて、drawable-hdpiフォルダ、drawable-xhdpiフォルダ、drawable-xxhdpiフォルダを作ってそこに高解像度なビットマップ画像をガンガン放り込むと端末が勝手に読み込み先フォルダを判断する。例え読み込み先をdrawableとだけの指定にしていても。」

・・・って、そんなん気づくかいッ!
えぇえぇ、いろいろチュートリアルとかガイドとかすっとばして、「たぶんこうだろ、エイッ!」といきあたりばったりで開発している私が悪うございました。

ただ、よくよく考えると既に100枚ほどある画像を解像度ごとに拡大して作成するなんてやってられない。実力あれば簡単にスクリプト組んで自動で作成することもできるんでしょうけど、そこまでの実力はない。たとえやったとしてもアプリのファイルサイズが大きくなるのはイケてない…

で、取り急ぎの解決策は

「端末に応じてプロジェクト自体から別につくってしまい、drawable-hdpiフォルダだけでビルドするもの、drawable-xhdpiフォルダだけでビルドするもの」

という大変にベタなものでした。とりあえずこれで凌げたのですが、そうすると今後、アプリのメンテがはげしくメンドくさい。複数ビルドしていかないといけないので、なんとかならんのかと模索していると、まさかの

「画像を拡大させないdrawable-nodpiフォルダがある」

これに、「canvasを端末の解像度で計算した割合でscaleで拡大表示させる」ことで解決。はあ。なんと回り道。
で、今はSurfaceViewとButtonを組み合わせたActivityを研究中。
XMLでのレイアウトって、慣れるとiOSよりずーっと簡単(というかわかりやすい)なのがいいんですよね。
未だにiOSのAuto Layoutはクセを読み切れておらず、学習コストがかかりそうでがっつり取り組む気になりません・・・。
f:id:tadakazu1972:20150830230041p:plain