dipにすればいいってモンじゃない! - ReDo

2011年11月24日

dipにすればいいってモンじゃない!

「よく分からないけど大丈夫なはずの表示が壊れる」というorzな話があったので備忘録代わりに。

どうやってこういうのは防げばいいんですかね・・・。

以下の様なlayoutのXMLがあったとします。
※ネタ元ではImageViewでしたがTextViewで代用しています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
    <TextView
        android:layout_width="160dip"
        android:layout_height="80dip"
        android:background="#ff0000"
        android:text="red 160dip" />
    <TextView
        android:layout_width="160dip"
        android:layout_height="80dip"
        android:background="#00ff00"
        android:text="green 160dip" />
    <TextView
        android:layout_width="160dip"
        android:layout_height="80dip"
        android:background="#0000ff"
        android:text="blue 160dip" />
</LinearLayout>

このレイアウトは、同一解像度でも、dpiが違う端末では表示が変わってしまいます。

WVGA(800x480)のmdpi(160dpi)ではこうなります
wvga-mdpi.jpg

WVGA(800x480)のhdpi(240dpi)ではこうなります
wvga-hdpi.jpg

「pxじゃなくてdip(dp)を使いましょう」という話は、以下の"当然のこと"を守る前提じゃないと効果を発揮しません。

「画像は全てdot by dotで表示させるために、dpi別で用意して、固定サイズ(9patchではない)の素材はlayout_widthとlayout_heightに必ずwrap_contentを指定する。」

・実機で確認しない
・エミュレータを正しく使わない
・画像にマジックナンバで幅・高さを指定する
・dpi別の画像を用意しない

という4重のハードルを飛び越えてきた強敵でした。

# mdpi-middleなんてDELL Streak(001DL)ぐらい?

コメントする