我需要使用dip / dp(在java文件中)编写android小部件的布局。在运行时如果我编码,
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
这将返回屏幕宽度(以像素为单位)(px)。为了将其转换为dp,我编码:
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
这似乎没有回到正确的答案。我制作了WVGA800的模拟器,其屏幕分辨率为480×800。当运行模拟器并让代码打印像素和dp的值时,两者都达到了320。该仿真器为240 dpi,其比例因子为0.75。
答案 0 :(得分:346)
试试这个
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
或强>
谢谢@TomášHubálek
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
答案 1 :(得分:98)
我偶然发现了谷歌的这个问题,后来我找到了一个对API> = 13有效的简单解决方案。
供将来参考:
Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.
请参阅Configuration class reference
编辑:正如Nick Baicoianu所说,这将返回屏幕的可用宽度/高度(在大多数情况下应该是有趣的)。如果您需要实际显示尺寸,请选择最佳答案。
答案 2 :(得分:7)
您缺少默认密度值160。
2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
3 px = 2 dip if dpi == 240(hdpi), 840x480 screen
换句话说,如果你在纵向模式下设计宽度等于160dip的布局,它将是所有ldpi / mdpi / hdpi设备屏幕的一半(我认为除了平板电脑)
答案 3 :(得分:6)
如何使用它呢?
final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
答案 4 :(得分:6)
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;
int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;
int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;
int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;
答案 5 :(得分:6)
简化为Kotlin:
val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
答案 6 :(得分:4)
科特林的答案:
context?.let {
val displayMetrics = it.resources.displayMetrics
val dpHeight = displayMetrics.heightPixels / displayMetrics.density
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
}
答案 7 :(得分:1)
获取具有良好装饰的DP的屏幕宽度和高度:
第1步:创建界面
public interface ScreenInterface {
float getWidth();
float getHeight();
}
第2步:创建实施者类
public class Screen implements ScreenInterface {
private Activity activity;
public Screen(Activity activity) {
this.activity = activity;
}
private DisplayMetrics getScreenDimension(Activity activity) {
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics;
}
private float getScreenDensity(Activity activity) {
return activity.getResources().getDisplayMetrics().density;
}
@Override
public float getWidth() {
DisplayMetrics displayMetrics = getScreenDimension(activity);
return displayMetrics.widthPixels / getScreenDensity(activity);
}
@Override
public float getHeight() {
DisplayMetrics displayMetrics = getScreenDimension(activity);
return displayMetrics.heightPixels / getScreenDensity(activity);
}
}
第3步:获取活动中的宽度和高度:
Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();
答案 8 :(得分:1)
如果您只想了解屏幕宽度,则可以在开发人员选项中搜索“最小屏幕宽度”。您甚至可以对其进行编辑。
答案 9 :(得分:1)
这是一个复制/粘贴功能,将根据之前的回复使用。
/**
* @param context
* @return the Screen height in DP
*/
public static float getHeightDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
return dpHeight;
}
/**
* @param context
* @return the screnn width in dp
*/
public static float getWidthDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
return dpWidth;
}
答案 10 :(得分:0)
尝试一下:
Display display = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width = displaySize.x;
int height = displaySize.y;
答案 11 :(得分:-5)
你的问题是将float转换为int,失去了精度。你也应该乘以因子而不是除以。
这样做:
int dp = (int)(pixel*getResources().getDisplayMetrics().density);