我需要确切地知道设备上屏幕的实际长度单位有多大,这样我才能计算重力加速度,以像素/毫秒为单位。
Android API中是否有为此的方法?
我需要确切地知道设备上屏幕的实际长度单位有多大,这样我才能计算重力加速度,以像素/毫秒为单位。
Android API中是否有为此的方法?
使用以下内容:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(mWidthPixels/dm.xdpi,2);
double y = Math.pow(mHeightPixels/dm.ydpi,2);
double screenInches = Math.sqrt(x+y);
Log.d("debug","Screen inches : " + screenInches);
当 mWidthPixels 和 mHeightPixels 取自下面的代码时
private void setRealDeviceSizeInPixels()
{
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
// since SDK_INT = 1;
mWidthPixels = displayMetrics.widthPixels;
mHeightPixels = displayMetrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
{
try
{
mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
}
catch (Exception ignored)
{
}
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
{
try
{
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
mWidthPixels = realSize.x;
mHeightPixels = realSize.y;
}
catch (Exception ignored)
{
}
}
请参阅此帖子以供参考: 以像素为单位获取屏幕尺寸
最后使用 Math.round 获取当前大小。
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(dm.widthPixels/dm.xdpi,2);
double y = Math.pow(dm.heightPixels/dm.ydpi,2);
double screenInches = Math.sqrt(x+y);
Log.d("debug","Screen inches : " + screenInches);
screenInches= (double)Math.round(screenInches * 10) / 10;
使用xdpi * widthPixels
,ydpi * heightPixels
可能会得到你想要的我想。
以下代码片段将帮助您获得以英寸为单位的屏幕尺寸
public static double getScreenSizeInches(Activity activity){
WindowManager windowManager = activity.getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
// since SDK_INT = 1;
int mWidthPixels = displayMetrics.widthPixels;
int mHeightPixels = displayMetrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) {
try{
mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
} catch (Exception ignored) {}
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17) {
try {
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
mWidthPixels = realSize.x;
mHeightPixels = realSize.y;
} catch (Exception ignored) {}
}
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(mWidthPixels / dm.xdpi, 2);
double y = Math.pow(mHeightPixels / dm.ydpi, 2);
return Math.sqrt(x + y);
}
希望这有帮助。
我用它来获得真正的尺寸
final DisplayMetrics metrics = new DisplayMetrics();
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
windowManager.getDefaultDisplay().getRealMetrics(metrics);
}
else {
windowManager.getDefaultDisplay().getMetrics(metrics);
}
int realHeight = metrics.heightPixels; // This is real height
int realWidth = metrics.widthPixels; // This is real width
我已经尝试了其他答案中提到的大多数方法,但是这些方法在特定设备上失败了。所以这是我对解决这个问题的一点贡献。代码是用 Kotlin 编写的
获取 DisplayMetrics 对象:
val manager = mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val displayMetrics = DisplayMetrics()
manager.getDefaultDisplay().getMetrics(displayMetrics)
以英寸为单位计算屏幕宽度,如下所示:
val widthInDotPoints : Double = (displayMetrics.widthPixels * (160 * 1.0 /displayMetrics.densityDpi))
val widthInInches : Double = width / displayMetrics.xdpi
在这里,我使用 widthPixels 以点点 (dp) 为单位计算了设备的宽度,然后将其转换为以英寸为单位的宽度。我已使用 160 .ie DisplayMetrics.DENSITY_MEDIUM 作为转换因子将 widthPixels 转换为 widthInDotPoints。
同样,以英寸为单位计算屏幕高度:
val heightInDotPoints : Double = (displayMetrics.heightPixels * (160 * 1.0 /displayMetrics.densityDpi))
val heightInInches : Double = height / displayMetrics.ydpi
您需要使用屏幕密度来计算这一点。
Context.getResources().getDisplayMetrics().density
根据文档:
显示的逻辑密度。这是密度无关像素单元的缩放因子,其中一个 DIP 是大约 160 dpi 屏幕(例如 240x320、1.5"x2" 屏幕)上的一个像素,提供系统显示的基线。因此,在 160dpi 屏幕上,此密度值为 1;在 120 dpi 屏幕上为 0.75;等等
此值并不完全遵循实际屏幕尺寸(由 xdpi 和 ydpi 给出,而是用于根据显示 dpi 的总体变化逐步缩放整个 UI 的尺寸。例如,240x320 的屏幕将有一个密度为 1,即使其宽度为 1.8"、1.3" 等。但是,如果屏幕分辨率增加到 320x480 但屏幕尺寸仍然为 1.5"x2",那么密度会增加(可能会增加到 1.5)。