android - 取得 - pt dp 変換




ピクセルをdpに変換する (20)

コトリン

fun convertDpToPixel(dp: Float, context: Context): Float {
    return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

fun convertPixelsToDp(px: Float, context: Context): Float {
    return px / (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

Java

public static float convertDpToPixel(float dp, Context context) {
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

public static float convertPixelsToDp(float px, Context context) {
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

解像度が480x800のPantechデバイスの高さと幅をピクセルで指定してアプリケーションを作成しました。

G1デバイスの高さと幅を変換する必要があります。 私はそれをdpに変換して問題を解決し、両方のデバイスに同じ解決策を提供すると考えました。

ピクセルをdpに変換する簡単な方法はありますか? 助言がありますか?


Android開発ガイドによると:

px = dp * (dpi / 160)

しかし、しばしば、ピクセルで表現されたデザインを受け取ったときに、これを逆に実行したいと思うことがあります。 そう:

dp = px / (dpi / 160)

240dpiデバイスの場合、この比率は1.5です(前述のように)。つまり、60pxのアイコンがアプリケーションで40dpに相当します。


Xamarin.Androidの場合

float DpToPixel(float dp)
{
    var resources = Context.Resources;
    var metrics = resources.DisplayMetrics;
    return dp * ((float)metrics.DensityDpi / (int)DisplayMetricsDensity.Default);
}

これを非静的にすることは、カスタムレンダラを作成するときに必要です


kotlinの拡張機能を使用したより洗練されたアプローチ

/**
 * Converts dp to pixel
 */
val Int.dpToPx: Int get() = (this * Resources.getSystem().displayMetrics.density).toInt()

/**
 * Converts pixel to dp
 */
val Int.pxToDp: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt()

使用法:

println("16 dp in pixel: ${16.dpToPx}")
println("16 px in dp: ${16.pxToDp}")

PXDPは異なりますが類似しています。

DPは、画面の物理的なサイズのみを考慮する場合の解像度です。 DPを使用すると、異なるpixel密度の他の同様のサイズの画面にレイアウトが拡大されます。

時には実際にpixelsが必要な場合もあります。コード内のディメンションを扱うときは、変換しない限り、実際のpixelsを扱います。

だから、アンドロイドデバイスでは、通常のサイズのhdpi画面、 800x480 is 533x320 DP800x480 is 533x320 (私は信じています)。 DPpixels /1.5に変換するには、 *1.5戻し*1.5 。 これは、1画面サイズとdpi場合のみで、デザインによって変わります。 私たちのアーティストは私のpixels与えて、上記の1.5方程式でDPに変換します。


DP to Pixel

dimens.xml値を作成する

<dimen name="textSize">20dp</dimen>

pixelその値を次のように取得します。

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

おそらく、値/ dimen内の次元を持つ場合の最良の方法は、getDimension()メソッドから次元を直接取得することです。既に次元に変換された次元をピクセル値に戻します。

context.getResources().getDimension(R.dimen.my_dimension)

これをより良く説明するために、

getDimension(int resourceId) 

既にピクセルAS FLOATに変換されたディメンションを返します。

getDimensionPixelSize(int resourceId)

同じものを返しますが、INTに切り捨てられます。

Androidのリファレンスをご覧ください


このような:

public class ScreenUtils {

    public static float dpToPx(Context context, float dp) {
        if (context == null) {
            return -1;
        }
        return dp * context.getResources().getDisplayMetrics().density;
    }

    public static float pxToDp(Context context, float px) {
        if (context == null) {
            return -1;
        }
        return px / context.getResources().getDisplayMetrics().density;
    }
}

コンテキストに依存し、浮動小数点値を返す、静的メソッド

from: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15 : https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15


これをコンテキストなしで使うことができます

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

@Stanが述べたように、このアプローチを使用すると、システムの密度が変わると問題が発生する可能性があります。 だからそれに気をつけてください!

個人的に私はそれを行うためにコンテキストを使用しています。


これはdpをピクセルに変換します:

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

これはdpに変換ピクセルを与える必要があります:

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

したがって、次のフォーマッタを使用して、dpで指定されたディメンションから適切なピクセル数を計算することができます

public int convertToPx(int dp) {
    // Get the screen's density scale
    final float scale = getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    return (int) (dp * scale + 0.5f);
}


ディメンションXMLを使用することができれば、それは非常に簡単です!

あなたのres/values/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="thumbnail_height">120dp</dimen>
    ...
    ...
</resources>

次にJavaで:

getResources().getDimensionPixelSize(R.dimen.thumbnail_height);

パフォーマンス重視のアプリケーションを開発する場合は、次の最適化されたクラスを検討してください。

public final class DimensionUtils {

    private static boolean isInitialised = false;
    private static float pixelsPerOneDp;

    // Suppress default constructor for noninstantiability.
    private DimensionUtils() {
        throw new AssertionError();
    }

    private static void initialise(View view) {
        pixelsPerOneDp = view.getResources().getDisplayMetrics().densityDpi / 160f;
        isInitialised = true;
    }

    public static float pxToDp(View view, float px) {
        if (!isInitialised) {
            initialise(view);
        }

        return px / pixelsPerOneDp;
    }

    public static float dpToPx(View view, float dp) {
        if (!isInitialised) {
            initialise(view);
        }

        return dp * pixelsPerOneDp;
    }
}

ピクセルをdpに変換するには、 http://developer.android.com/reference/android/util/TypedValue.html使用しhttp://developer.android.com/reference/android/util/TypedValue.html

ドキュメントに記載されているとおり:動的に型指定されたデータ値のコンテナ。

applyDimensionメソッドを使用します。

public static float applyDimension (int unit, float value, DisplayMetrics metrics) 

次のように、次元を保持する解凍された複合データ値を最終浮動小数点値に変換します。

Resources resource = getResources();
float dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 69, resource.getDisplayMetrics());

それがほしいと思っています。


上記の素晴らしいソリューションがたくさんあります。 しかし、私が見つけた最高のソリューションは、Googleのデザインです:

https://design.google.com/devices/


  ((MyviewHolder) holder).videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(final MediaPlayer mediaPlayer) {
                    mediaPlayer.setLooping(true);
                    ((MyviewHolder) holder).spinnerView.setVisibility(View.GONE);
                    mediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
                        @Override
                        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                /*
                 * add media controller
                 */
                            MediaController controller = new MediaController(mContext);
                            float density = mContext.getResources().getDisplayMetrics().density;
                            float px = 55 * density;
//                        float dp = somePxValue / density;
                            controller.setPadding(0, 0, 0, (int) (px));

                            ((MyviewHolder) holder).videoView.setMediaController(controller);


                        }
                    });
                }
            });


/**
 * This method converts dp unit to equivalent pixels, depending on device density. 
 * 
 * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent px equivalent to dp depending on device density
 */
public static float convertDpToPixel(float dp, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

/**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

densityは等しい

  • .75 on ldpi120 dpi)
  • 1.0mdpi (160dpi;ベースライン)
  • 1.5 on hdpi240 dpi)
  • 2.0 on xhdpi320 dpi)
  • 3.0 on xxhdpi480 dpi)
  • 4.0 on xxxhdpi640 dpi)

このオンラインコンバータを使用して、dpi値で遊びます。

編集: dpiバケットとdensity間に1:1の関係がないようです。 Nexus 5X xxhdpidensity値は2.6253ではなく)です。 Device Metricsで自分自身を参照してください。


float scaleValue = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scaleValue + 0.5f);




dpi