デバイスのdpサイズを取得 | get device DP Size | Android

スポンサーリンク
スポンサーリンク

デバイスのdpサイズを取得

今回は、スマートフォンのサイズ取得です。スマートフォンのサイズや解像度の取得が必要になることは開発ではよく遭遇します。

レイアウトを扱うXMLではDPを用いるのに対し、Javaのコード上ではpxを用いることから変換が必要になるわけです。

ではまず、サイズ(px)を取得します。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Log0","X is "+getDisplaySize(this).x+" Y is "+getDisplaySize(this).y);
    }
    public Point getDisplaySize(Activity thisActivity){
        Display display = thisActivity.getWindowManager().getDefaultDisplay();;
        Point point =new Point();
        display.getSize(point);
        return point;
    }
}

という具合です。DisplayとPointを使って取得します。
ただし、この値は解像度(px)であってDPではありません。
そこで、DP値に変更します。

PX(ピクセル)をDPに変換する

public float px2dp(int px, Context context){
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return px / metrics.density;
}

DPをPX(ピクセル)に変換する

public int dp2px(float dp,Context context){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,context.getResources().getDisplayMetrics());
}

一連の流れをまとめたコード

public class MainActivity extends AppCompatActivity {
    float xf;
    float yf;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        xf = getDisplaySize(this).x;
        yf = getDisplaySize(this).y;
        Log.d("Log0","X is "+xf+" Y is "+yf); // get px size

        xf = px2dp(getDisplaySize(this).x,this);
        yf = px2dp(getDisplaySize(this).y,this);
        Log.d("Log0","X is "+xf+" Y is "+yf); // px to dp
        xf = dp2px(xf,this);
        yf = dp2px(yf,this);
        Log.d("Log0","X is "+xf+" Y is "+yf); //dp to px

    }
    public Point getDisplaySize(Activity thisActivity){
        Display display = thisActivity.getWindowManager().getDefaultDisplay();;
        Point point =new Point();
        display.getSize(point);
        return point;
    }
    public float px2dp(int px, Context context){
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return px / metrics.density;
    }
    public float dp2px(float dp,Context context){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,context.getResources().getDisplayMetrics());
    }
}

出力は

D/Log0: X is 1080 Y is 1920
D/Log0: X is 360.0 Y is 640.0
D/Log0: X is 1080.0 Y is 1920.0

となりました。.0が不要なら必要な時にintにキャストしましょう。