将像素转换为dp

956

我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800

我需要将高度和宽度转换为 G1 设备。
我认为将其转换为 dp 可以解决问题,并为两个设备提供相同的解决方案。

有没有简单的方法将像素转换为 dp?
有什么建议吗?


1
如果您想进行一次性转换(例如从Photoshop导出精灵),这里有一个不错的转换器 - Paul Lammertsma
3
pxdpsp 转换公式:在 Android 中,px 表示像素,是屏幕上的一个点;dp 表示密度无关像素,它会根据屏幕密度进行缩放;sp 表示可缩放像素,通常用于文本字号大小。以下是相互转化的公式:
  • px to dp: dp = px / (dpi / 160)
  • dp to px: px = dp * (dpi / 160)
  • sp to px: px = sp * (dpi / 160)
其中,dpi 是指每英寸包含的像素数。
- Suragch
http://web.archive.org/web/20140808234241/http://developer.android.com/guide/practices/screens_support.html#dips-pels - caw
35个回答

2
这��我有用(C#):
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);

不是回答这个问题,但对于C#来说它有效。谢谢。 - Yekmer Simsek

1

对于 Xamarin.Android

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

将其改为非静态的是在创建自定义渲染器时必要的。

0

开发者文档提供了如何将dp单位转换为像素单位的答案:

在某些情况下,您需要使用dp表示尺寸,然后将其转换为像素。将dp单位转换为屏幕像素很简单:

px = dp * (dpi / 160)

文档提供了两个代码示例,一个是Java示例,另一个是Kotlin示例。这里是Java示例:

// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...

Kotlin 示例:

// The gesture threshold expressed in dp
private const val GESTURE_THRESHOLD_DP = 16.0f
...
private var mGestureThreshold: Int = 0
...
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Get the screen's density scale
    val scale: Float = resources.displayMetrics.density
    // Convert the dps to pixels, based on density scale
    mGestureThreshold = (GESTURE_THRESHOLD_DP * scale + 0.5f).toInt()

    // Use mGestureThreshold as a distance in pixels...
}

我从Java示例中创建的Java方法运行良好:
/**
 * Convert dp units to pixel units
 * https://developer.android.com/training/multiscreen/screendensities#dips-pels
 *
 * @param dip input size in density independent pixels
 *            https://developer.android.com/training/multiscreen/screendensities#TaskUseDP
 *
 * @return pixels
 */
private int dpToPixels(final float dip) {
    // Get the screen's density scale
    final float scale = this.getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    final int pix = Math.round(dip * scale + 0.5f);
    
    if (BuildConfig.DEBUG) {
        Log.i(DrawingView.TAG, MessageFormat.format(
                "Converted: {0} dip to {1} pixels",
                dip, pix));
    }
    
    return pix;
}

这个问题的其他答案提供了类似于这个答案的代码,但是其他答案中没有足够的支持文档让我知道其他答案是否正确。被接受的答案也与这个答案不同。我认为开发者文档使Java解决方案清晰明了。

在Compose中也有一个解决方案。Compose中的Density提供了一行解决方案,用于设备无关像素(dp)和像素之间的转换。

val sizeInPx = with(LocalDensity.current) { 16.dp.toPx() }

-1

要将 dp 转换为 px,可以使用以下代码:

public static int dpToPx(Context context, int dp) {
       final float scale = context.getResources().getDisplayMetrics().density;
       return (int) (dp * scale + 0.5f);
    }

-3
((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);
            }
        });
    }
});

我认为您的帖子需要一些额外的词汇和适当的格式,有一次我甚至以为自己在回答完全不同的问题。 - RickertBrandsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接