我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800
。
我需要将高度和宽度转换为 G1 设备。
我认为将其转换为 dp 可以解决问题,并为两个设备提供相同的解决方案。
有没有简单的方法将像素转换为 dp?
有什么建议吗?
我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800
。
我需要将高度和宽度转换为 G1 设备。
我认为将其转换为 dp 可以解决问题,并为两个设备提供相同的解决方案。
有没有简单的方法将像素转换为 dp?
有什么建议吗?
DP 转像素
在 dimens.xml
文件中创建一个数值
<dimen name="textSize">20dp</dimen>
将该值以 像素
为单位获取:
int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.textSize);
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);
}
convertToDp
。 - Qwertie在Android SDK中有一个默认的工具: http://developer.android.com/reference/android/util/TypedValue.html
float resultPix = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
resultPix
应该是 int 类型。int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
- vovahostfun 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)
}
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);
}
这应该为您提供了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);
}
如果您在values/dimen中具有尺寸,则最好的方法是直接从getDimension()方法中获取尺寸,它将返回已转换为像素值的尺寸。
context.getResources().getDimension(R.dimen.my_dimension)
仅为更好地解释此事,
getDimension(int resourceId)
将以浮点数形式返回已转换为像素的尺寸。
getDimensionPixelSize(int resourceId)
将返回相同的值,但被截断为整数,以便作为整数使用。
Kotlin:
fun spToPx(ctx: Context, sp: Float): Float {
return sp * ctx.resources.displayMetrics.scaledDensity
}
fun pxToDp(context: Context, px: Float): Float {
return px / context.resources.displayMetrics.density
}
fun dpToPx(context: Context, dp: Float): Float {
return dp * context.resources.displayMetrics.density
}
Java:
public static float spToPx(Context ctx,float sp){
return sp * ctx.getResources().getDisplayMetrics().scaledDensity;
}
public static float pxToDp(final Context context, final float px) {
return px / context.getResources().getDisplayMetrics().density;
}
public static float dpToPx(final Context context, final float dp) {
return dp * context.getResources().getDisplayMetrics().density;
}
像这样:
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;
}
}
根据上下文,返回浮点数值,静态方法。
float scaleValue = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scaleValue + 0.5f);
如果您正在开发一款性能关键的应用程序,请考虑以下优化类:
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;
}
}
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