我需要使用 dip/dp(在 java 文件中)对 android 小部件的布局进行编码。如果我在运行时编码,
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
这将返回以像素 (px) 为单位的屏幕宽度。要将其转换为 dp,我编写了代码:
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
这似乎没有返回正确答案。我制作了 WVGA800 的模拟器,它的屏幕分辨率为 480 x 800。当运行模拟器并让代码打印像素和 dp 的值时,两者都达到了 320。该模拟器为 240 dpi,其比例因子为 0.75。
正如@Tomáš Hubálek 提到的那样;尝试类似:
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
或者
尝试旧答案:
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;
我偶然发现了 Google 提出的这个问题,后来我发现了一个适用于 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 所指出的,这将返回屏幕的可用宽度/高度(这在大多数用途中应该是有趣的)。如果您需要实际显示尺寸,请坚持最佳答案。
为 Kotlin 简化的 2022 答案:
val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
或作为单线:
val (height, width) = resources.displayMetrics.run { heightPixels/density to widthPixels/density }
density
来自 run 块中的 DisplayMetrics
。
改用这个怎么样?
final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
您缺少 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 设备上屏幕的一半(我认为平板电脑除外)
DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
。然后,outMetrics.density
将为您提供当前设备的比例因子,如 docs 中所述
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;
用科特林回答:
context?.let {
val displayMetrics = it.resources.displayMetrics
val dpHeight = displayMetrics.heightPixels / displayMetrics.density
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
}
根据 DP 获取屏幕宽度和高度,并进行一些很好的修饰:
第一步:创建接口
public interface ScreenInterface {
float getWidth();
float getHeight();
}
第二步:创建实现类
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();
在 Compose on a line 的新世界中
val (height, width) = LocalConfiguration.current.run { screenHeightDp.dp to screenWidthDp.dp }
这是基于先前响应使用的复制/粘贴功能。
/**
* @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;
}
如果您只是想了解您的屏幕宽度,您可以在开发者选项中搜索“最小屏幕宽度”。你甚至可以编辑它。
尝试这个:
Display display = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width = displaySize.x;
int height = displaySize.y;
您的问题是将浮点数转换为 int,从而失去精度。您还应该乘以因子而不是除以。
做这个:
int dp = (int)(pixel*getResources().getDisplayMetrics().density);