Есть ли способ определить физическую высоту экрана андроида в сантиметрах или дюймах?
Мне нужно точно знать, насколько велик экран на устройстве в реальных единицах длины, чтобы я мог рассчитать ускорение под действием силы тяжести в пикселях на миллисекунду.
Есть ли где-нибудь метод в Android API для этого?
8 ответов
Используйте следующее:
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;
Android-разработчики экрана информации.
использование 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
Я пробовал большинство способов, упомянутых в других ответах, но эти методы не работают на определенных устройствах. Вот небольшой мой вклад в решение этой проблемы. Код написан на Котлине
Получите объект 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
Здесь я рассчитал ширину устройства в точках (dp), используя widthPixels, а затем преобразовал ее в ширину в дюймах. Я использовал 160 .ie DisplayMetrics.DENSITY_MEDIUM в качестве коэффициента преобразования для преобразования widthPixels в widthInDotPoints.
Точно так же рассчитайте высоту экрана в дюймах:
val heightInDotPoints : Double = (displayMetrics.heightPixels * (160 * 1.0 /displayMetrics.densityDpi))
val heightInInches : Double = height / displayMetrics.ydpi
Некоторые устройства, такие как пиксель, возвращают xdpi, ydpi неверен. Таким образом, вы можете рассчитать основу плотности.
fun getScreenSizeInInches(context: Context): Float {
try {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
context.display
} else {
windowManager.defaultDisplay
}
val metrics = DisplayMetrics()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
display?.getRealMetrics(metrics)
} else {
display?.getMetrics(metrics)
}
// Calculate the diagonal size in inches using Pythagorean theorem
var xdpi = metrics.xdpi
if (xdpi < 160) {
xdpi = getDPIFromDensity(metrics.density)
}
var ydpi = metrics.ydpi
if (ydpi < 160) {
ydpi = getDPIFromDensity(metrics.density)
}
val widthInInches = metrics.widthPixels / xdpi
val heightInInches = metrics.heightPixels / ydpi
val diagonalInInches = sqrt(widthInInches.pow(2) + heightInInches.pow(2))
Log.d("diagonalInInches", metrics.toString() + "\n" + diagonalInInches.toString())
return diagonalInInches
} catch (e: Exception) {
return 6.0f
}
}
/*
* Some device pixel return xdpi, ydpi not correct.
* */
private fun getDPIFromDensity(density: Float): Float {
val dpi = 160 * density
Log.d("getDPIFromDensity", dpi.toString())
return dpi
}
Вы должны использовать плотность экрана, чтобы рассчитать это.
Context.getResources().getDisplayMetrics().density
Согласно документации:
Логическая плотность дисплея. Это коэффициент масштабирования для модуля, независимого от плотности пикселей, где один DIP - это один пиксель на экране с разрешением приблизительно 160 точек на дюйм (например, экран 240x320, 1,5"x2"), обеспечивающий базовую линию отображения системы. Таким образом, на экране с разрешением 160 точек на дюйм это значение плотности будет 1; на экране с разрешением 120 точек на дюйм это будет 0,75; и т.п.
Это значение не совсем соответствует реальному размеру экрана (как указано в xdpi и ydpi, а скорее используется для масштабирования размера общего пользовательского интерфейса в шагах на основе грубых изменений в dpi дисплея. Например, экран 240x320 будет иметь плотность равна 1, даже если его ширина составляет 1,8", 1,3" и т. д. Однако, если разрешение экрана увеличится до 320x480, а размер экрана останется 1,5"x2", плотность будет увеличена (вероятно, до 1,5).