引数の単位がpxになっていることがあります。
しかしながら、単純にpxの単位で指定してしまっては、
デバイスの実画面サイズやdpiに依存することになり、
ユーザのそれぞれのデバイスで同じように表示させることができなくなってしまいます。
以下の記事で紹介したように、それぞれのデバイスで同じように表示させるにはdpやspの単位を使用する必要があります。
なので、この記事ではpx⇔dp⇔spを動的に変換する方法を紹介します。
=== 目次 ===
px⇔dpの変換方法
このセクションではpx⇔dpの変換方法を紹介します。以下の記事で紹介したようにdpの定義は160 dpiデバイスのときに1 px = 1 dpとなり、dpiが変わると相対的に変化します。 よって、アプリが動作しているデバイスのdpiが160 dpiに対して何倍か?を知ればpx⇔dpを変換することができます。
アプリが動作しているデバイスのdpiが160 dpiに対して何倍か?は以下のコードで取得することができます。
context.getResources().getDisplayMetrics().density
よって、dp→pxの変換は以下のようになります。
public float converDpToPx(float dp) {
return dp * context.getResources().getDisplayMetrics().density;
}
逆にpx→dpの変換は以下のようになります。 public float converPxToTo(float px) {
return px / context.getResources().getDisplayMetrics().density;
}
px⇔spの変換方法
px⇔spの変換についても同様にデバイスのスケールを表すオブジェクトが用意されています。具体的には以下です。
context.getResources().getDisplayMetrics().scaledDensity
よって、sp→pxの変換は以下のようになります。
public float converSpToPx(float sp) {
return sp * context.getResources().getDisplayMetrics().scaleDensity;
}
逆にpx→spの変換は以下のようになります。 public float converPxToSp(float px) {
return px / context.getResources().getDisplayMetrics().scaleDensity;
}
dp⇔spの変換方法
dp⇔spの変換方法については、ここまでのpx⇔dpの変換方法とpx⇔spの変換方法を組み合わせることで実現させることができます。まとめ
この記事ではAndoridアプリ開発においてpx⇔dp⇔spを動的に変換する方法を紹介しました。相対的単位を上手に利用することでユーザのデバイスサイズに依存しない優れたUIをデザインしましょう!