我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800
。
我需要将高度和宽度转换为 G1 设备。
我认为将其转换为 dp 可以解决问题,并为两个设备提供相同的解决方案。
有没有简单的方法将像素转换为 dp?
有什么建议吗?
我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800
。
我需要将高度和宽度转换为 G1 设备。
我认为将其转换为 dp 可以解决问题,并为两个设备提供相同的解决方案。
有没有简单的方法将像素转换为 dp?
有什么建议吗?
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
对于 Xamarin.Android
float DpToPixel(float dp)
{
var resources = Context.Resources;
var metrics = resources.DisplayMetrics;
return dp * ((float)metrics.DensityDpi / (int)DisplayMetricsDensity.Default);
}
开发者文档提供了如何将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...
}
/**
* 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() }
要将 dp 转换为 px
,可以使用以下代码:
public static int dpToPx(Context context, int dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
((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);
}
});
}
});
px
、dp
、sp
转换公式:在 Android 中,px
表示像素,是屏幕上的一个点;dp
表示密度无关像素,它会根据屏幕密度进行缩放;sp
表示可缩放像素,通常用于文本字号大小。以下是相互转化的公式:px
todp
:dp = px / (dpi / 160)
dp
topx
:px = dp * (dpi / 160)
sp
topx
:px = sp * (dpi / 160)
dpi
是指每英寸包含的像素数。 - Suragch