[〜#〜] dp [〜#〜]、[〜#〜] sp [〜#〜]と[〜 #〜] px [〜#〜]。そして、このトピックを検索した後、完全に満足できるものは何も見つかりませんでした。この投稿は重複しているかもしれませんが、[〜#〜] dp [〜#〜]から[〜#〜] px [ 〜#〜]、および[〜#〜] dp [〜#〜] to [〜#〜] sp [〜#〜]、from- [〜#〜] sp [〜#〜] to [〜#〜] px [〜#〜]、from [〜#〜] px [〜# 〜] to [〜#〜] sp [〜#〜]、from [〜#〜] sp [〜#〜] to [ 〜#〜] dp [〜#〜]、from [〜#〜] dp [〜#〜] to [〜#〜] sp [〜#〜]?これを行うためのコードをいくつか知っていますが、それらは不完全です。
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);
}
受け入れられた答えには、いくつかの便利な変換がありません。
float sp = 20;
float px = sp * getResources().getDisplayMetrics().scaledDensity;
または
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
float px = 70;
float sp = px / getResources().getDisplayMetrics().scaledDensity;
float dp = 20;
float px = dp * getResources().getDisplayMetrics().density;
または
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
float px = 70;
float dp = px / getResources().getDisplayMetrics().density;
20
および70
)は任意の値でした。必要に応じて、異なる番号をプラグインできます。px
はピクセルを指します。画面スペースの1インチあたりのデバイスのピクセル数は密度と呼ばれます。dp
は、密度に依存しないピクセルを意味します。つまり、使用するデバイスに関係なく、実際のサイズは同じである必要があります。たとえば、ビューを100 dp
幅に設定した場合、新しい高密度電話でも古い低密度電話と同じ幅になります。 (幅を100 px
に設定した場合、低密度の電話では大きく表示され、高密度の電話では小さく表示されます。)密度はインチあたりのドット数(DPI)で測定されます。式はpx = dp * density
です。したがって、px
とdp
の間で変換するには、密度で乗算または除算するだけです。sp
は、スケールに依存しないピクセルを意味します。ビューではなく、フォントにのみ使用されます。 dp
に似ていますが、ユーザー設定も考慮する点が異なります。ユーザー設定を考慮したこの密度は、スケーリング密度と呼ばれます。たとえば、TextView
フォントを30 sp
のサイズに設定すると、すべてのデバイスでテキストが物理的に同じサイズに見えるようになります。ただし、お使いの祖母は、お使いの携帯電話の設定でお好みのフォントサイズを最大に設定している場合があります。したがって、30 sp
テキストは、お使いの携帯電話よりも携帯電話で大きく見えます。式はpx = sp * scaledDensity
です。ディメンションを整数またはピクセルに変換するには、 "getDimensionPixelSize(R.dimen.your_dp_value)"関数を使用する必要があります。 ..
Dimens.xmlで値を作成します
<dimen name="padding_10">10dp</dimen>
これで、ピクセルまたは整数の値に対して、次のように使用できます。
int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
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
_ ファイルに配置します)