Android 画面サイズ取得方法


Android端末は多種多様であり、ディスプレイサイズも様々です。
またアプリケーションによっては使用する範囲が画面サイズなのか、タイトルバーを含むハードウェアサイズなのかで用意するコンテンツも異なります。
今回は対象端末の各サイズを取得する方法を紹介します。

プログラム

java
import java.lang.reflect.Method;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Point;
import android.os.Build;
import android.view.Display;
import android.view.View;

public class DisplaySizeCheck {

    /**
     * Get a Display Size
     * @param activity
     * @return Point, Point.x or Point.y
     */
    public static Point getDisplaySize(Activity activity){
        Display display = activity.getWindowManager().getDefaultDisplay();
        Point point = new Point();
        display.getSize(point);
        return point;
    }

    /**
     * Get a Real Size(Hardware Size)
     * @param activity
     * @return
     */
    @SuppressLint("NewApi")
    public static Point getRealSize(Activity activity) {

        Display display = activity.getWindowManager().getDefaultDisplay();
        Point point = new Point(0, 0);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            // Android 4.2~
            display.getRealSize(point);
            return point;

        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            // Android 3.2~
            try {
                Method getRawWidth = Display.class.getMethod("getRawWidth");
                Method getRawHeight = Display.class.getMethod("getRawHeight");
                int width = (Integer) getRawWidth.invoke(display);
                int height = (Integer) getRawHeight.invoke(display);
                point.set(width, height);
                return point;

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return point;
    }

    /**
     * Get a view size. if display view size, after onWindowFocusChanged of method
     * @param View
     * @return
     */
    public static Point getViewSize(View View){
        Point point = new Point(0, 0);
        point.set(View.getWidth(), View.getHeight());        

        return point;
    }

}

※参考イメージ

諸処解説します。

●getDisplaySizeはコンテンツ領域とタイトルバーを含んだサイズになります。
※イメージでは青色の枠

●getRealSizeは端末ディスプレイ全体のサイズになります。
※イメージでは赤色の枠

●getViewSizeはコンテンツ領域のサイズになります。
※イメージでは緑色の枠
※各Viewコンテンツのサイズも取得可能(TextViewなど)
※取得の際に注意が必要(下記を参考)

getViewSizeの注意点

getViewSizeはコンテンツ領域のサイズはViewコンテンツを指定して取得します。
ただAcitivity内のonCreateで取得した場合、値が0のままで返ってしまうので、画面のコンテンツ領域サイズを取得する場合は、Activity#onWindowFocusChangedメソッドから取得してください。
※参考プログラム

java
@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        RelativeLayout r = (RelativeLayout)findViewById(R.id.relativeLayout);
        Point view = DisplaySizeCheck.getViewSize(r);

        StringBuilder text = new StringBuilder();
        text.append("ViewSize → X:" + view.x + " Y:" + view.y);
        text.append("\nDisplaySize → X:" + disp.x + " Y:" + disp.y);
        text.append("\nHardwareSize → X:" + real.x + " Y:" + real.y);

        dipSize.setText(text.toString());
    }