Existe uma maneira de determinar a altura da tela física do Android em cm ou polegadas?
-
25-09-2019 - |
Pergunta
Preciso saber exatamente o tamanho da tela no dispositivo em unidades reais de comprimento para que eu possa calcular a aceleração devido à gravidade em pixels por milissegundos.
Existe um método em algum lugar da API do Android para isso?
Solução
Use o seguinte:
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);
Quando Mwidthpixels e MHEightPixels são retirados do código abaixo
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)
{
}
}
Veja este post para referência:Obtenha dimensões da tela em pixels
Outras dicas
Para obter o tamanho atual, use matemática.
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;
Os desenvolvedores do Android são informações sobre a tela.
usar xdpi * widthPixels
e ydpi * heightPixels
Pode te dar o que você quer, eu acho.
A seguir o snippet de código o ajudará a obter Tamanho da tela em polegadas
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);
}
Espero que isso ajude.
Eu usei isso para obter o tamanho real
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
Você precisa usar a densidade da tela para calcular isso.
Context.getResources().getDisplayMetrics().density
De acordo com a documentação:
A densidade lógica da tela. Este é um fator de escala para a unidade de pixel independente de densidade, onde um mergulho é um pixel em uma tela de aproximadamente 160 dpi (por exemplo, uma tela de 240x320, 1,5 "x2"), fornecendo a linha de base da tela do sistema. Assim, em uma tela de 160dpi, esse valor de densidade será 1; Em uma tela de 120 dpi, seria 0,75; etc.
Esse valor não segue exatamente o tamanho da tela real (conforme dado por XDPI e YDPI, mas é usado para escalar o tamanho da interface do usuário geral em etapas com base em mudanças brutas no DPI da tela. Por exemplo, uma tela de 240x320 terá uma A densidade de 1, mesmo que sua largura seja 1,8 ", 1,3", etc. No entanto, se a resolução da tela for aumentada para 320x480, mas o tamanho da tela permaneceu 1,5 "x2", a densidade seria aumentada (provavelmente para 1,5).