有没有办法确定android的物理屏幕高度(厘米或英寸)?
我需要知道设备上屏幕的实际长度单位有多大,这样我才能计算重力引起的加速度,单位为像素/毫秒有没有办法确定android的物理屏幕高度(厘米或英寸)?,android,screen,resolution,inches,Android,Screen,Resolution,Inches,我需要知道设备上屏幕的实际长度单位有多大,这样我才能计算重力引起的加速度,单位为像素/毫秒 Android API中是否有用于此的方法?您需要使用屏幕密度来计算此值 Context.getResources().getDisplayMetrics().density 根据文件: 显示器的逻辑密度。这是密度无关像素单元的比例因子,其中一个倾角是大约160 dpi屏幕(例如240x320,1.5“x2”屏幕)上的一个像素,提供系统显示的基线。因此,在160dpi屏幕上,该密度值为1;在120 dp
Android API中是否有用于此的方法?您需要使用屏幕密度来计算此值
Context.getResources().getDisplayMetrics().density
根据文件:
显示器的逻辑密度。这是密度无关像素单元的比例因子,其中一个倾角是大约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)
使用xdpi*widthPixels
和ydpi*heightPixels
可能会得到您想要的。我认为。使用以下方法:
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)
{
}
}
private void setRealDeviceSizeInPixels()
{
WindowManager WindowManager=getWindowManager();
Display Display=windowManager.getDefaultDisplay();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
display.getMetrics(displayMetrics);
//因为SDK_INT=1;
mWidthPixels=displayMetrics.widthPixels;
mHeightPixels=displayMetrics.heightPixels;
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=14&&Build.VERSION.SDK_INT<17)
{
尝试
{
mWidthPixels=(整数)Display.class.getMethod(“getRawWidth”).invoke(Display);
mHeightPixels=(整数)Display.class.getMethod(“getRawHeight”).invoke(Display);
}
捕获(忽略异常)
{
}
}
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=17)
{
尝试
{
点realSize=新点();
Display.class.getMethod(“getRealSize”,Point.class).invoke(Display,realSize);
mWidthPixels=realSize.x;
mHeightPixels=realSize.y;
}
捕获(忽略异常)
{
}
}
请参阅本帖:
要获取当前大小,请在末尾使用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;
下面的代码片段将帮助您获得以英寸为单位的屏幕大小
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);
}
公共静态双getScreenSizeInches(活动){
WindowManager WindowManager=activity.getWindowManager();
Display Display=windowManager.getDefaultDisplay();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
display.getMetrics(displayMetrics);
//因为SDK_INT=1;
int mWidthPixels=displayMetrics.widthPixels;
int mHeightPixels=displayMetrics.heightPixels;
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=14&&Build.VERSION.SDK_INT<17){
试一试{
mWidthPixels=(整数)Display.class.getMethod(“getRawWidth”).invoke(Display);
mHeightPixels=(整数)Display.class.getMethod(“getRawHeight”).invoke(Display);
}捕获(忽略异常){}
}
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=17){
试一试{
点realSize=新点();
Display.class.getMethod(“getRealSize”,Point.class).invoke(Display,realSize);
mWidthPixels=realSize.x;
mHeightPixels=realSize.y;
}捕获(忽略异常){}
}
DisplayMetrics dm=新的DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
double x=数学功率(mWidthPixels/dm.xdpi,2);
双y=数学功率(mHeightPixels/dm.ydpi,2);
返回数学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.I.DisplayMetrics.DENSITY_media作为转换因子,将宽度像素转换为宽度点
同样,以英寸为单位计算屏幕高度:
val heightInDotPoints : Double = (displayMetrics.heightPixels * (160 * 1.0 /displayMetrics.densityDpi))
val heightInInches : Double = height / displayMetrics.ydpi
如另一张海报所述,使用xdpi和ydpi。密度故意不是物理屏幕大小的绝对映射,而是一个更抽象的单位,可以量化为少量离散值(目前为120dpi、160dpi、240dpi)。这是一种糟糕的方法,会导致dpi和分辨率的值不准确。我有约15台测试设备,其中一些设备出现故障,例如,它在摩托罗拉里程碑或中兴手机等某些型号上不起作用。返回值不准确,因为
getMetrics
(和display.getwidt()
,或display.getHeight()
)返回应用程序可用的值(例如,它不包含操作栏高度)。因此,在1280x800屏幕上,您可以获得值1260x800或1280x780等等。正如STeN提到的,此计算对于某些设备是不正确的。例如,此代码报告了一个3“的机器人仿生屏幕,实际上有一个4.3”的屏幕仿生上xdpi和ydpi的返回值分别为368和365,可能是由于奔腾显示器或摩托罗拉混淆。Th