web-dev-qa-db-ja.com

DP、PX、SPを互いに変換する方法、特にDPとSP?

[〜#〜] dp [〜#〜][〜#〜] sp [〜#〜][〜 #〜] px [〜#〜]。そして、このトピックを検索した後、完全に満足できるものは何も見つかりませんでした。この投稿は重複しているかもしれませんが、[〜#〜] dp [〜#〜]から[〜#〜] px [ 〜#〜]、および[〜#〜] dp [〜#〜] to [〜#〜] sp [〜#〜]、from- [〜#〜] sp [〜#〜] to [〜#〜] px [〜#〜]、from [〜#〜] px [〜# 〜] to [〜#〜] sp [〜#〜]、from [〜#〜] sp [〜#〜] to [ 〜#〜] dp [〜#〜]、from [〜#〜] dp [〜#〜] to [〜#〜] sp [〜#〜]?これを行うためのコードをいくつか知っていますが、それらは不完全です。

48
SilentKnight

DPからPX:

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

SPからPX:

public static int spToPx(float sp, Context context) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
}

DPからSP:

public static int dpToSp(float dp, Context context) {
    return (int) (dpToPx(dp, context) / context.getResources().getDisplayMetrics().scaledDensity);
}
124
AndroidEx

受け入れられた答えには、いくつかの便利な変換がありません。

SPからPX

float sp = 20;
float px = sp * getResources().getDisplayMetrics().scaledDensity;

または

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());

PXからSP

float px = 70;
float sp = px / getResources().getDisplayMetrics().scaledDensity;

DPからPX

float dp = 20;
float px = dp * getResources().getDisplayMetrics().density;

または

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());

PXからDP

float px = 70;
float dp = px / getResources().getDisplayMetrics().density;

ノート

  • 上記で選択したフロート(20および70)は任意の値でした。必要に応じて、異なる番号をプラグインできます。
  • pxはピクセルを指します。画面スペースの1インチあたりのデバイスのピクセル数は密度と呼ばれます。
  • dpは、密度に依存しないピクセルを意味します。つまり、使用するデバイスに関係なく、実際のサイズは同じである必要があります。たとえば、ビューを100 dp幅に設定した場合、新しい高密度電話でも古い低密度電話と同じ幅になります。 (幅を100 pxに設定した場合、低密度の電話では大きく表示され、高密度の電話では小さく表示されます。)密度はインチあたりのドット数(DPI)で測定されます。式はpx = dp * densityです。したがって、pxdpの間で変換するには、密度で乗算または除算するだけです。
  • spは、スケールに依存しないピクセルを意味します。ビューではなく、フォントにのみ使用されます。 dpに似ていますが、ユーザー設定も考慮する点が異なります。ユーザー設定を考慮したこの密度は、スケーリング密度と呼ばれます。たとえば、TextViewフォントを30 spのサイズに設定すると、すべてのデバイスでテキストが物理的に同じサイズに見えるようになります。ただし、お使いの祖母は、お使いの携帯電話の設定でお好みのフォントサイズを最大に設定している場合があります。したがって、30 spテキストは、お使いの携帯電話よりも携帯電話で大きく見えます。式はpx = sp * scaledDensityです。
  • DPとSPの意味
  • DP SP変換は一般的に有用ではありません
48
Suragch

ディメンションを整数またはピクセルに変換するには、 "getDimensionPixelSize(R.dimen.your_dp_value)"関数を使用する必要があります。 ..

Dimens.xmlで値を作成します

<dimen name="padding_10">10dp</dimen>

これで、ピクセルまたは整数の値に対して、次のように使用できます。

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
4

kotlinの場合、拡張関数を作成しました。

_fun Number.spToPx(context: Context) = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics).toInt()
_

16.spToPx(context)または16.5.spToPx(context)のように使用できます

(このような関数を _KotlinExtensions.kt_ ファイルに配置します)

2
vedant