我有一个自定义操作栏,我想要一个80岁!它的高度。 所以我用这段代码将布局高度设置为80dp:
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
xdpi = displayMetrics.xdpi;
x = Math.round(80 * (xdpi / DisplayMetrics.DENSITY_DEFAULT))
... new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, x);
但它在xxxhdpi设备中很大。 当我删除转换并直接使用80pixels值时,似乎没问题, 何时使用转换后的dp以及何时使用直接像素?
修改 问题出在其他地方,我将“80dp”值存储在xml中并使用“context.getResources()。getDimension()”检索它,它似乎在内部将维度转换为像素,而我实际上正在转换转换后的值!我想知道在使用“sp”字体时是否会发生同样的事情....
答案 0 :(得分:1)
你正在做正确的事情,只是你的转换错了,它应该是这样的:
float scale = context.getResources().getDisplayMetrics().density;
x = Math.round(80 * scale);
... new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, x);
答案 1 :(得分:0)
将dp转换为像素:
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return px;
}
将像素转换为dp:
public int pxToDp(int px) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return dp;
}
答案 2 :(得分:0)
像素到Dp转换器
public static float pxToDp(float px) {
float densityDpi = Resources.getSystem().getDisplayMetrics().densityDpi;
return px / (densityDpi / 160f);
}
Dp到像素转换器
public static int dpToPx(int dp) {
float density = Resources.getSystem().getDisplayMetrics().density;
return Math.round(dp * density);
}