GROUPエンジニアブログです。>2013年04月23日17:49カテゴリAndroidAndroid端末の横幅に合わせて画像を配置こんにちは、android事業室の平井(@shinbashi)です。唐突ですが「android端末の、画面横幅に合わせて比率を崩さずに画像を配置したい」なんてことがよくありますよね。僕は最近そんな事がありました。そこで困った問題にぶち当たったので、そのことを書きたいと思います。Pixels」いわゆるdipでサイズを決定すればイイッ!って話になりますよね。今回は全然関係ないです。そもそもdipってpixelに依存しないって意味ですし。今回はpixelに依存したいという話なので。それではどうしたのか書きたいと思います。1番と2番は試してみたけど出来なかった、もしくは試したくもなかった方法ですので、3番から読むと良いと思います。やりたいこと画面の横幅いっぱいに背景を表示して、その画像の上にピンポイントで指定した位置に背景のスケールと同じスケールで画像を表示したい。dpで指定するッ!試しに、720x1240の画面サイズで、xhdpi(320dpi)の画面密度の端末にたいして横幅いっぱいを指定する場合、dipで指定すると360dp(1dp=2px)となります。他の代表的な画面サイズや画面密度の組み合わせだと以下の様になります。480dp色の付いている部分が組み合わせとして多いパターンですね。画面サイズの比率と、画面密度の比率は一致しません。dpであらゆる端末で横幅ピッタリに指定することは不可能でした。いうか、画面横幅に合わせて画像を表示したいのであればImageViewのScaleTypeをCenterCropにすればよいという話ですね。はい、画像一つ表示するだけならそれでオッケーです。今回は、背景となる画像の上に被せて、指定した位置ピッタリに画像を表示したい。なんならアニメーションしたい。そんな話だったとしましょう。正しい座標に、正しいスケールで表示しなければなりません。CenterCropとか使っちゃったら、背景の画像がどんな比率で拡大されたのか知る術はありません(あるかもしれません)。考えずに画像を設置した場合、端末が変わるとずれます。背景をCenterCrop、ImageViewで画像を適当に配置した場合、下の例だと1.125倍くらいずれます。はみ出してしまったポチもなんだか悲しげですね。layout-000x000で指定するッ!drawable-xhdpiのようなディレクトリのように、layoutもハイフン以降に色々指定して条件に合わせて変えることができます。「layout-small」とか「layout-480x320」こんな形で指定することができます。やった!コレで解決!第三部完!でも少なくとも僕はレイアウトが変更になるたびに何個も似たようなファイルのサイズを計算しなおして修正するなんてしたくないです。画面サイズを取得して動的にサイズを指定するはい、結局こういう手段に落ち着きました。横幅720pxというものを基準に全ての画像を作成し、とりあえずdrawable-xhdpiにぶち込みます。他のdpiのディレクトリにも、正しい比率で拡縮したものを入れておきます。dpで指定出来ないので、画像のサイズはonCreateなどで全てBitmapを作成し、ImageViewにsetImageBitmapメソッドでセットするとします。sizeの略だと思います。false);こんな風に使えると思います。全部こうして指定してやれば、背景の比率に合わせて画像を表示したり、座標を指定したりできます。横に合わせたら縦がはみ出たそうは問屋がおろしませんでした。横幅だけ気にしてたら、縦にはみ出ました。そんなわけで、横幅に合わせた場合、当然縦は合いません。小さなものに合わせた場合、画面は縦にどのくらい使えるのか調べました。どのサイズまで対応するかにもよりますが、日本の普通の携帯端末だったら小さくても320x480が多いと思いますので、変な画面サイズに対応する気がないのであれば、720x1280を基準にした場合には、下に200pxほど余白が生まれるように作れば、画面からはみ出すことは無さそうです。そんな訳で、あまり役に立たなそうではありますが、最近僕がandroidのアプリ開発で困った出来事について書かせて頂きました。上手いやり方があるような気がしてならないので「そんなことしなくても、こうすればいいのに」というような事がございましたら、是非コメントをいただければと思います。