Como obter dimensões de tela como pixels no Android -- android campo com layout campo com screen campo com pixel campo com dimensions camp Relacionado O problema

How to get screen dimensions as pixels in Android


1876
vote

problema

português

Eu criei alguns elementos personalizados, e quero colocá-los programaticamente para o canto superior direito ( n pixels da borda superior e function checkEmail(){ if(form.email.value==" "){ alert("Please enter a email"); } 0 pixels da borda direita) . Portanto, preciso obter a largura da tela e a altura da tela e depois definir a posição:

  function checkEmail(){ if(form.email.value==" "){      alert("Please enter a email"); } 1   

Como obtenho function checkEmail(){ if(form.email.value==" "){ alert("Please enter a email"); } 2 e function checkEmail(){ if(form.email.value==" "){ alert("Please enter a email"); } 3 na atividade principal?

Inglês Original

I created some custom elements, and I want to programmatically place them to the upper right corner (n pixels from the top edge and m pixels from the right edge). Therefore I need to get the screen width and screen height and then set position:

int px = screenWidth - m; int py = screenHeight - n; 

How do I get screenWidth and screenHeight in the main Activity?

</div
              
         
         

Lista de respostas

3507
 
vote
vote
Melhor resposta
 

Se você quiser as dimensões de exibição em pixels, você pode usar getSize :

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y;    

Se você não estiver em um Activity Você pode obter o padrão Display via WINDOW_SERVICE :

  WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay();    

Se você estiver em um fragmento e deseja avomplicar isso basta usar atividade.windowManager (em xamarin.android) ou getatividade (). getwindowManager () (em java).

Antes getSize foi introduzido (no nível da API 13), você pode usar o getWidth e getHeight métodos que estão agora descontados:

.
  Display display = getWindowManager().getDefaultDisplay();  int width = display.getWidth();  // deprecated int height = display.getHeight();  // deprecated    

Para o caso de uso que você está descrevendo, no entanto, uma margem / preenchimento no layout parece mais apropriada.

Outra maneira é: exibeTrics

.

Uma estrutura que descreve informações gerais sobre uma exibição, como seu tamanho, densidade e dimensionamento de fonte. Para acessar os membros do DisplayMetrics, inicialize um objeto como este:

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 0   

Podemos usar Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 1 para obter informações para:

.

"a largura absoluta da exibição em pixels."

exemplo:

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 2   

nível de API 30 Atualização

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 3   
 

If you want the display dimensions in pixels you can use getSize:

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 

If you're not in an Activity you can get the default Display via WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); 

If you are in a fragment and want to acomplish this just use Activity.WindowManager (in Xamarin.Android) or getActivity().getWindowManager() (in java).

Before getSize was introduced (in API level 13), you could use the getWidth and getHeight methods that are now deprecated:

Display display = getWindowManager().getDefaultDisplay();  int width = display.getWidth();  // deprecated int height = display.getHeight();  // deprecated 

For the use case you're describing however, a margin/padding in the layout seems more appropriate.

Another way is: DisplayMetrics

A structure describing general information about a display, such as its size, density, and font scaling. To access the DisplayMetrics members, initialize an object like this:

DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); 

We can use widthPixels to get information for:

"The absolute width of the display in pixels."

Example:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels); 

Api level 30 update

final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();  // Gets all excluding insets  final WindowInsets windowInsets = metrics.getWindowInsets();  Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()          | WindowInsets.Type.displayCutout());   int insetsWidth = insets.right + insets.left;  int insetsHeight = insets.top + insets.bottom;   // Legacy size that Display#getSize reports  final Rect bounds = metrics.getBounds();  final Size legacySize = new Size(bounds.width() - insetsWidth,          bounds.height() - insetsHeight); 
</div
 
 
         
         
381
 
vote

Uma maneira é:

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 4   

Está depreciado e você deve tentar o seguinte código. As duas primeiras linhas de código fornecem o Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 5 Objecs. Esses objetos contêm os campos como Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 6 , Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 7 .

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 8   

nível de API 30 Atualização

  Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 9   
 

One way is:

Display display = getWindowManager().getDefaultDisplay();  int width = display.getWidth(); int height = display.getHeight(); 

It is deprecated, and you should try the following code instead. The first two lines of code gives you the DisplayMetrics objecs. This objects contains the fields like heightPixels, widthPixels.

DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);        int height = metrics.heightPixels; int width = metrics.widthPixels; 

Api level 30 update

final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();  // Gets all excluding insets  final WindowInsets windowInsets = metrics.getWindowInsets();  Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()          | WindowInsets.Type.displayCutout());   int insetsWidth = insets.right + insets.left;  int insetsHeight = insets.top + insets.bottom;   // Legacy size that Display#getSize reports  final Rect bounds = metrics.getBounds();  final Size legacySize = new Size(bounds.width() - insetsWidth,          bounds.height() - insetsHeight); 
</div
 
 
         
         
121
 
vote

Pode não responder a sua pergunta, mas poderia ser útil saber (eu estava procurando por isso quando cheguei a esta pergunta) que, se você precisar de uma dimensão de visão, mas seu código está sendo executado quando seu layout não foi Lada ainda (por exemplo, em Activity0 ), você pode configurar um Activity1 com Activity2 e colocar o código relevante que precisa da dimensão da visualização lá. O retorno do ouvinte será chamado quando o layout terá sido estabelecido.

 

It may not answer your question, but it could be useful to know (I was looking for it myself when I came to this question) that if you need a View's dimension but your code is being executed when its layout has not been laid out yet (for example in onCreate() ) you can setup a ViewTreeObserver.OnGlobalLayoutListener with View.getViewTreeObserver().addOnGlobalLayoutListener() and put the relevant code that needs the view's dimension there. The listener's callback will be called when the layout will have been laid out.

</div
 
 
         
         
110
 
vote

(resposta de 2012, pode estar desatualizada) Se você quiser suportar pré-favo pré-mel, você precisará colocar uma compatibilidade anterior antes da API 13. Algo como:

  Activity3   

É claro que os métodos depreciados acabarão por ser retirados dos mais recentes sdks, mas enquanto nós ainda confiamos na maioria dos nossos usuários tendo Android 2.1, 2.2 e 2.3, é isso que somos deixados.

 

(2012 answer, may be out of date) If you want to support pre Honeycomb, you will need to put in backward compatibility prior to API 13. Something like:

int measuredWidth = 0; int measuredHeight = 0; WindowManager w = getWindowManager();  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {     Point size = new Point();     w.getDefaultDisplay().getSize(size);     measuredWidth = size.x;     measuredHeight = size.y; } else {     Display d = w.getDefaultDisplay();     measuredWidth = d.getWidth();     measuredHeight = d.getHeight(); } 

Of course the deprecated methods will eventually be taken out of the the most recent SDKs, but while we still rely on most of our users having Android 2.1, 2.2 and 2.3, this is what we are left with.

</div
 
 
   
   
71
 
vote

Eu tentei todas as possíveis "soluções" sem sucesso e notei que o aplicativo de Elliott Hughes '"Dalvik Explorer" sempre mostra a dimensão correta em qualquer versão do Android / OS. Acabei olhando para o projeto de código aberto que pode ser encontrado aqui: https://code.google.com/p/enh/

Aqui está todo o código relevante:

  Activity4   

editar: versão ligeiramente melhorada (Evite disparar exceções na versão do sistema operacional não suportada):

  Activity5   
 

I have tried all possible "solutions" unsuccessfully and I noticed that Elliott Hughes' "Dalvik Explorer" app always shows correct dimension on any Android device/OS version. I ended up looking at his open source project that can be found here: https://code.google.com/p/enh/

Here's all the relevant code:

WindowManager w = activity.getWindowManager(); Display d = w.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); d.getMetrics(metrics); // since SDK_INT = 1; widthPixels = metrics.widthPixels; heightPixels = metrics.heightPixels; try {     // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)     widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);     heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d); } catch (Exception ignored) { } try {     // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)     Point realSize = new Point();     Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);     widthPixels = realSize.x;     heightPixels = realSize.y; } catch (Exception ignored) { } 

EDIT: slightly improved version (avoid firing exceptions on non-supported OS version):

WindowManager w = activity.getWindowManager(); Display d = w.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); d.getMetrics(metrics); // since SDK_INT = 1; widthPixels = metrics.widthPixels; heightPixels = metrics.heightPixels; // includes window decorations (statusbar bar/menu bar) if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) try {     widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);     heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d); } 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(d, realSize);     widthPixels = realSize.x;     heightPixels = realSize.y; } catch (Exception ignored) { } 
</div
 
 
         
         
48
 
vote

maneira mais simples:

   int screenHeight = getResources().getDisplayMetrics().heightPixels;  int screenWidth = getResources().getDisplayMetrics().widthPixels;     
 

Simplest way:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;  int screenWidth = getResources().getDisplayMetrics().widthPixels;  
</div
 
 
47
 
vote

Para acessar a altura da barra de status para dispositivos Android, preferimos uma maneira programática de obtê-lo:

código de amostra

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); }    

A variável result dá a altura no pixel.

para acesso rápido

Digite a descrição da imagem aqui

Para mais informações sobre a altura de Title bar , Navigation bar e Content View , olhe, olhe Tamanhos da tela do dispositivo Android .

 

For accessing the height of the status bar for Android devices, we prefer a programmatic way to get it:

Sample code

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 

The variable result gives the height in the pixel.

For quick access

Enter image description here

For more information about height of Title bar, Navigation bar and Content View, kindly look on Android Device Screen Sizes.

</div
 
 
   
   
33
 
vote

primeiro obter visualização (por exemplo, por findViewById() ) e, em seguida, você pode usar getwidth () na própria opinião.

 

First get view (eg. by findViewById()) and then you can use getWidth() on the view itself.

</div
 
 
   
   
28
 
vote

Eu tenho duas funções, uma para enviar o contexto e a outra obtenção de altura e largura em pixels:

  public static int getWidth(Context mContext){     int width=0;     WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);     Display display = wm.getDefaultDisplay();     if(Build.VERSION.SDK_INT>12){         Point size = new Point();         display.getSize(size);         width = size.x;     }     else{         width = display.getWidth();  // Deprecated     }     return width; }    

e

  public static int getHeight(Context mContext){     int height=0;     WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);     Display display = wm.getDefaultDisplay();     if(Build.VERSION.SDK_INT>12){         Point size = new Point();         display.getSize(size);         height = size.y;     }     else{         height = display.getHeight();  // Deprecated     }     return height; }    
 

I have two functions, one for sending the context and the other getting height and width in pixels:

public static int getWidth(Context mContext){     int width=0;     WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);     Display display = wm.getDefaultDisplay();     if(Build.VERSION.SDK_INT>12){         Point size = new Point();         display.getSize(size);         width = size.x;     }     else{         width = display.getWidth();  // Deprecated     }     return width; } 

and

public static int getHeight(Context mContext){     int height=0;     WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);     Display display = wm.getDefaultDisplay();     if(Build.VERSION.SDK_INT>12){         Point size = new Point();         display.getSize(size);         height = size.y;     }     else{         height = display.getHeight();  // Deprecated     }     return height; } 
</div
 
 
   
   
18
 
vote

Para dimensionar dinamicamente usando XML há um atributo chamado "Android: Layout_weight"

O exemplo abaixo, modificado da resposta do synic em this thread , mostra um botão que ocupa 75% da tela (peso = 0,25) e uma visão de texto que ocupam os 25% restantes da tela (peso = 0,75).

  <LinearLayout android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:orientation="horizontal">      <Button android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_weight=".25"         android:text="somebutton">      <TextView android:layout_width="fill_parent"         android:layout_height="Wrap_content"         android:layout_weight=".75"> </LinearLayout>    
 

For dynamically scaling using XML there is an attribute called "android:layout_weight"

The below example, modified from synic's response on this thread, shows a button that takes up 75% of the screen (weight = .25) and a text view taking up the remaining 25% of the screen (weight = .75).

<LinearLayout android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:orientation="horizontal">      <Button android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_weight=".25"         android:text="somebutton">      <TextView android:layout_width="fill_parent"         android:layout_height="Wrap_content"         android:layout_weight=".75"> </LinearLayout> 
</div
 
 
18
 
vote

Este é o código que uso para a tarefa:

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 0   

Parece limpo o suficiente e ainda assim, cuida da deprecação.

 

This is the code I use for the task:

// `activity` is an instance of Activity class. Display display = activity.getWindowManager().getDefaultDisplay(); Point screen = new Point(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {     display.getSize(screen); } else {                 screen.x = display.getWidth();     screen.y = display.getHeight(); } 

Seems clean enough and yet, takes care of the deprecation.

</div
 
 
18
 
vote

Isso não é uma solução muito melhor? exibeMetrics vem com tudo o que você precisa e funciona da API 1.

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 1   

Você também pode obter a exibição real (incluindo decorações de tela, como barra de status ou barra de navegação de software) usando getrealmetrics , mas isso funciona em mais de 17 anos.

Estou perdendo alguma coisa?

 

Isn't this a much better solution? DisplayMetrics comes with everything you need and works from API 1.

public void getScreenInfo(){     DisplayMetrics metrics = new DisplayMetrics();     getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);      heightPixels = metrics.heightPixels;     widthPixels = metrics.widthPixels;     density = metrics.density;     densityDpi = metrics.densityDpi; } 

You can also get the actual display (including screen decors, such as Status Bar or software navigation bar) using getRealMetrics, but this works on 17+ only.

Am I missing something?

</div
 
 
 
 
16
 
vote

Apenas adicionando à resposta de Francesco. O outro observador que é mais apto, se você quiser descobrir que o local na janela ou localização na tela é ViewRreeObserver.OnpredrawListener ()

Isso também pode ser usado para encontrar outros atributos de uma visão que é principalmente desconhecida em oncreate () e.g. a posição rolada, a posição escalada.

 

Just adding to Francesco's answer. The other observer that is more apt, if you want to find out the location in window or location in screen is ViewTreeObserver.OnPreDrawListener()

This also can be used to find other attributes of a view that is mostly unknown at onCreate() time e.g. the scrolled position, the scaled position.

</div
 
 
16
 
vote

Usando o seguinte código na atividade.

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 2   
 

Using the following code in Activity.

DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int height = metrics.heightPixels; int wwidth = metrics.widthPixels; 
</div
 
 
16
 
vote

Localizar largura e altura da tela:

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 3   

Usando isso, podemos obter o mais recente e acima do SDK 13.

  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     result = getResources().getDimensionPixelSize(resId); } 4   
 

Find width and height of the screen:

width = getWindowManager().getDefaultDisplay().getWidth(); height = getWindowManager().getDefaultDisplay().getHeight(); 

Using this, we can get the latest and above SDK 13.

// New width and height int version = android.os.Build.VERSION.SDK_INT; Log.i("", " name == "+ version); Display display = getWindowManager().getDefaultDisplay(); int width; if (version >= 13) {     Point size = new Point();     display.getSize(size);     width = size.x;     Log.i("width", "if =>" +width); } else {     width = display.getWidth();     Log.i("width", "else =>" +width); } 
</div
 
 
16
 
vote
  DisplayMetrics dimension = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dimension); int w = dimension.widthPixels; int h = dimension.heightPixels;    
 
DisplayMetrics dimension = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dimension); int w = dimension.widthPixels; int h = dimension.heightPixels; 
</div
 
 
13
 
vote

Eu achei isso fez o truque.

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim);    
 

I found this did the trick.

Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 
</div
 
 
 
 
13
 
vote

precisa dizer que, se você não estiver em Activity , mas em View (ou ter variável de View digite no seu escopo) , não há necessidade de usar WINDOW_SERVICE . Então você pode usar pelo menos duas maneiras.

primeiro:

  DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();    

segundo:

  DisplayMetrics dm = new DisplayMetrics(); yourView.getDisplay().getMetrics(dm);    

Todos esses métodos que chamamos aqui não são reprovados.

 

Need to say, that if you are not in Activity, but in View (or have variable of View type in your scope), there is not need to use WINDOW_SERVICE. Then you can use at least two ways.

First:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics(); 

Second:

DisplayMetrics dm = new DisplayMetrics(); yourView.getDisplay().getMetrics(dm); 

All this methods we call here is not deprecated.

</div
 
 
13
 
vote
  public class AndroidScreenActivity extends Activity {      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);          DisplayMetrics dm = new DisplayMetrics();         getWindowManager().getDefaultDisplay().getMetrics(dm);         String str_ScreenSize = "The Android Screen is: "                                    + dm.widthPixels                                    + " x "                                    + dm.heightPixels;          TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);         mScreenSize.setText(str_ScreenSize);     } }    
 
public class AndroidScreenActivity extends Activity {      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);          DisplayMetrics dm = new DisplayMetrics();         getWindowManager().getDefaultDisplay().getMetrics(dm);         String str_ScreenSize = "The Android Screen is: "                                    + dm.widthPixels                                    + " x "                                    + dm.heightPixels;          TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);         mScreenSize.setText(str_ScreenSize);     } } 
</div
 
 
13
 
vote

Para obter as dimensões da tela Use métricas de exibição

  DisplayMetrics displayMetrics = new DisplayMetrics(); if (context != null)        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);       Display defaultDisplay = windowManager.getDefaultDisplay();       defaultDisplay.getRealMetrics(displayMetrics);     }    

Obtenha a altura e a largura em pixels

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 0   
 

For getting the screen dimensions use display metrices

DisplayMetrics displayMetrics = new DisplayMetrics(); if (context != null)        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);       Display defaultDisplay = windowManager.getDefaultDisplay();       defaultDisplay.getRealMetrics(displayMetrics);     } 

Get the height and width in pixels

int width  =displayMetrics.widthPixels; int height =displayMetrics.heightPixels; 
</div
 
 
11
 
vote

Esta não é uma resposta para o OP, como queria as dimensões de exibição em pixels reais. Eu queria as dimensões em "Device-Independent-Pixels", e colocando respostas daqui https://stackoverflow.com/a/17880012 / 253938 e aqui https://stackoverflow.com/a/6656774/253938 Eu vim com isso :

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 1   
 

This is not an answer for the OP, as he wanted the display dimensions in real pixels. I wanted the dimensions in "device-independent-pixels", and putting together answers from here https://stackoverflow.com/a/17880012/253938 and here https://stackoverflow.com/a/6656774/253938 I came up with this:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();     int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);     int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5); 
</div
 
 
10
 
vote

Você pode fazer o altura usando:

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 2   

e a largura usando

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 3   
 

You can do get the height size using :

getResources().getDisplayMetrics().heightPixels; 

and the width size using

getResources().getDisplayMetrics().widthPixels;  
</div
 
 
9
 
vote

Não há uma maneira não depreciada de fazer isso usando a exibição de exibição (API 1), que evita a bagunça try / catch:

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 4   
 

There is a non-deprecated way to do this using DisplayMetrics (API 1), that avoids the try/catch messiness:

 // initialize the DisplayMetrics object  DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();   // populate the DisplayMetrics object with the display characteristics  getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);   // get the width and height  screenWidth = deviceDisplayMetrics.widthPixels;  screenHeight = deviceDisplayMetrics.heightPixels; 
</div
 
 
9
 
vote

Eu iria envolver o código getsize assim:

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 5   
 

I would wrap the getSize code like this:

@SuppressLint("NewApi") public static Point getScreenSize(Activity a) {     Point size = new Point();     Display d = a.getWindowManager().getDefaultDisplay();     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {         d.getSize(size);     } else {         size.x = d.getWidth();         size.y = d.getHeight();     }     return size; } 
</div
 
 
 
 
7
 
vote

Para quem está procurando por dimensão de tela utilizável sem barra de status e barra de ação (também graças à resposta de Swapnil):

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 6   
 

For who is searching for usable screen dimension without Status Bar and Action Bar (also thanks to Swapnil's answer):

DisplayMetrics dm = getResources().getDisplayMetrics(); float screen_w = dm.widthPixels; float screen_h = dm.heightPixels;  int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) {     screen_h -= getResources().getDimensionPixelSize(resId); }  TypedValue typedValue = new TypedValue(); if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){     screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId); } 
</div
 
 
6
 
vote

primeiro carregue o arquivo XML e escreva este código:

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 7   

Mostrar largura e altura de acordo com sua resolução de tela.

 

First load the XML file and then write this code:

setContentView(R.layout.main);       Display display = getWindowManager().getDefaultDisplay(); final int width = (display.getWidth()); final int height = (display.getHeight()); 

Show width and height according your screen resolution.

</div
 
 
6
 
vote

Siga os métodos abaixo:

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 8   
 

Follow the methods below:

public static int getWidthScreen(Context context) {     return getDisplayMetrics(context).widthPixels; }  public static int getHeightScreen(Context context) {     return getDisplayMetrics(context).heightPixels; }  private static DisplayMetrics getDisplayMetrics(Context context) {     DisplayMetrics displayMetrics = new DisplayMetrics();     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);     wm.getDefaultDisplay().getMetrics(displayMetrics);     return displayMetrics; } 
</div
 
 
6
 
vote

KoTlin

  Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 9   
 

Kotlin

fun getScreenHeight(activity: Activity): Int {     val metrics = DisplayMetrics()     activity.windowManager.defaultDisplay.getMetrics(metrics)     return metrics.heightPixels }  fun getScreenWidth(activity: Activity): Int {     val metrics = DisplayMetrics()     activity.windowManager.defaultDisplay.getMetrics(metrics)     return metrics.widthPixels } 
</div
 
 
5
 
vote

Há momentos em que você precisa saber as dimensões precisas do espaço disponível para um layout quando na atividade oncrie. Depois de algum pensamento, eu trabalhei dessa maneira de fazer isso.

  Activity0   

Se por algum motivo você não quiser adicionar outra atividade ao manifesto do Android, você pode fazer desta forma:

  Activity1   
 

There are times when you need to know the precise dimensions of the available space for a layout when in an activity's onCreate. After some thought I worked out this way of doing it.

public class MainActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         startActivityForResult(new Intent(this, Measure.class), 1);         // Return without setting the layout, that will be done in onActivityResult.     }      @Override     protected void onActivityResult (int requestCode, int resultCode, Intent data) {         // Probably can never happen, but just in case.         if (resultCode == RESULT_CANCELED) {             finish();             return;         }         int width = data.getIntExtra("Width", -1);         // Width is now set to the precise available width, and a layout can now be created.            ...     } }  public final class Measure extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);        // Create a LinearLayout with a MeasureFrameLayout in it.         // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.         LinearLayout linearLayout = new LinearLayout(this);         LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);         MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);         measureFrameLayout.setLayoutParams(matchParent);         linearLayout.addView(measureFrameLayout);         this.addContentView(linearLayout, matchParent);         // measureFrameLayout will now request this second activity to finish, sending back the width.     }      class MeasureFrameLayout extends FrameLayout {         boolean finished = false;         public MeasureFrameLayout(Context context) {             super(context);         }          @SuppressLint("DrawAllocation")         @Override         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {             super.onMeasure(widthMeasureSpec, heightMeasureSpec);             if (finished) {                 return;             }             finished = true;             // Send the width back as the result.             Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));             Measure.this.setResult(Activity.RESULT_OK, data);             // Tell this activity to finish, so the result is passed back.             Measure.this.finish();         }     } } 

If for some reason you don't want to add another activity to the Android manifest, you can do it this way:

public class MainActivity extends Activity {     static Activity measuringActivity;      @Override     protected void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         Bundle extras = getIntent().getExtras();         if (extras == null) {             extras = new Bundle();         }         int width = extras.getInt("Width", -2);         if (width == -2) {             // First time in, just start another copy of this activity.             extras.putInt("Width", -1);             startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);             // Return without setting the layout, that will be done in onActivityResult.             return;         }         if (width == -1) {             // Second time in, here is where the measurement takes place.             // Create a LinearLayout with a MeasureFrameLayout in it.             // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.             LinearLayout linearLayout = new LinearLayout(measuringActivity = this);             LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);             MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);             measureFrameLayout.setLayoutParams(matchParent);             linearLayout.addView(measureFrameLayout);             this.addContentView(linearLayout, matchParent);             // measureFrameLayout will now request this second activity to finish, sending back the width.         }     }      @Override     protected void onActivityResult (int requestCode, int resultCode, Intent data) {         // Probably can never happen, but just in case.         if (resultCode == RESULT_CANCELED) {             finish();             return;         }         int width = data.getIntExtra("Width", -3);         // Width is now set to the precise available width, and a layout can now be created.          ...     }  class MeasureFrameLayout extends FrameLayout {     boolean finished = false;     public MeasureFrameLayout(Context context) {         super(context);     }      @SuppressLint("DrawAllocation")     @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {         super.onMeasure(widthMeasureSpec, heightMeasureSpec);         if (finished) {             return;         }         finished = true;         // Send the width back as the result.         Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));         MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);         // Tell the (second) activity to finish.         MainActivity.measuringActivity.finish();     } }     
</div
 
 
 
 
5
 
vote

Se você não quiser a sobrecarga de janelas, pontos ou exibições, você pode pegar os atributos de altura e largura do item de visualização superior em seu XML, desde que sua altura e largura estejam definidas para corresponder_parent. (Isso é verdade desde que seu layout ocupa a tela inteira.)

Por exemplo, se o seu XML começar com algo assim:

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/entireLayout"     android:layout_width="match_parent"     android:layout_height="match_parent" >    

Então findViewById(R.id.entireLayout).getWidth() retornará a largura da tela e findViewById(R.id.entireLayout).getHeight() retornará a altura da tela.

 

If you don't want the overhead of WindowManagers, Points, or Displays, you can grab the height and width attributes of the topmost View item in your XML, provided its height and width are set to match_parent. (This is true so long as your layout takes up the entire screen.)

For example, if your XML starts with something like this:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/entireLayout"     android:layout_width="match_parent"     android:layout_height="match_parent" > 

Then findViewById(R.id.entireLayout).getWidth() will return the screen's width and findViewById(R.id.entireLayout).getHeight() will return the screen's height.

</div
 
 

Perguntas relacionadas

2  Dimensão do cenário não relacionado SSAS  ( Ssas unrelated scenario dimension ) 
No nosso Cubo SSAS, temos valores reais e baseados em cenários. As tabelas têm a seguinte estrutura: ╔═════════════╦══════════════╗ ║ Scenario_ID ║...

0  Quaisquer plugins Cruiseecontrol para dimensões cm  ( Any cruisecontrol plugins for dimensions cm ) 
Os códigos de fontes são gerenciados com dimensão cm, e agora eu quero configurar o ambiente de integração contínua com o CruiseControl. Mas o problema é que ...

0  Dimensões de vídeo igual têm a mesma proporção  ( Equal video dimensions have same aspect ratio ) 
Eu upload de um vídeo de teste no YouTube com uma proporção de 2.39: 1 e o YouTube convertei nas seguintes qualidades: 240P, 360P 480P, 720p, 1080p. Eu baixei...

1876  Como obter dimensões de tela como pixels no Android  ( How to get screen dimensions as pixels in android ) 
Eu criei alguns elementos personalizados, e quero colocá-los programaticamente para o canto superior direito ( n pixels da borda superior e function checkEm...

1  Adicionando um relacionamento no cubo olap  ( Adding a relationship in olap cube ) 
é possível participar de uma dimensão para um cubo olap usando campos que não têm uma relação estrangeira-chave no banco de dB relacional subjacente? ...

4  As dimensões de um elemento são legíveis imediatamente após adicioná-lo à árvore Dom?  ( Are an elements dimensions readable immediately upon adding it to the dom tree ) 
Suponha que eu crie dinamicamente uma div Uso document.createElement , adicione algum texto interno e deseja determinar sua altura e largura. Eu posso ver qu...

3  C # System.Array Como contar ou encontrar quantas dimensões tem?  ( C sharp system array how to count or find how many dimensions it has ) 
Se eu tiver uma matriz desconhecida como um sistema.Array, como posso encontrar quantas dimensões tem? Estou pensando em algo que poderia ser chamado de array...

2  Algoritmos de Dimensionalidade de Estado-da-arte  ( State of the art of dimensionality algorithms ) 
Sabemos que há algoritmos para reduzir a dimensão de conjuntos de dados como PCA e Isomap Qual é o estado da arte no reduzindo a dimensionalidade aos conju...

1  Membros da dimensão do filtro e ajustar o membro 'todo' com base no filtro  ( Filter dimension members and adjust all member based on filter ) 
Eu tenho a seguinte declaração MDX, que resulta em uma lista de clientes por depósito que têm um valor não vazio para trabalhos. Esta declaração também filtra...

2  Descubra um conjunto de alta resolução de coordenadas?  ( Scaling down a high resolution set of co ordinates ) 
Aqui está algum plano de fundo para o problema. Estamos trabalhando com uma configuração de parede Eyevis, veja este link: http://www.eyevis.co.uk/ < / a> ...

8  Existe de qualquer maneira para "embalar" um jpanel?  ( Is there anyway to pack a jpanel ) 
Existe alguma coisa que eu possa fazer para fazer meu jpanel pack como um jframe, ou fazer algo assim. Eu quero fazer isso em vez de dar dimensões. Por favo...

29  Atribuindo 'Wrap_Content' ou '-2' à dimensão  ( Assigning wrap content or 2 to dimension ) 
Eu quero criar uma dimensão que seria igual a 'Wrap_Content' constante. Então, de acordo com Developer.android.com Referência Escreva: <dimen name="hor...

39  Obter dimensões de imagem com javascript antes de ser carregada totalmente  ( Get image dimensions with javascript before image has fully loaded ) 
Eu li sobre vários tipos de maneiras obtendo dimensões de imagem Uma vez que uma imagem for totalmente carregada, mas seria possível obter as dimensões de qua...

1  Modelo de dados relacional no modelo de dados dimensional  ( Relational data model into dimensional data model ) 
Eu criei o modelo de dados dimensional e depois percebi que não tenho relação ... Espero que você possa me ajudar! Deixe-me explicar o que eu fiz. Eu tirei ...

2  Como posso resolver essa matriz "Dimensões Matrix devem concordar"?  ( How can i solve this matlab matrix dimensions must agree error ) 
Eu estou digitando algum código para uma classe, mas toda vez que executo a função recebo o mesmo erro: ??? Error using ==> plus Matrix dimensions must agr...

107  Como definir o tamanho do texto usando a dimensão do XML no tempo de execução programaticamente?  ( How to set text size using dimension from xml at runtime programmatically ) 
em dimens.xml, eu tenho: <dimen name="text_medium">18sp</dimen> no tempo de execução, obtenho este valor e defina o tamanho do texto de uma exibição de...

5  Cálculo de preço com base em dimensões na página de produto único WooCommerce  ( Price calculation based on dimensions in woocommerce single product page ) 
com base em " Obter preço de variação selecionado no jQuery em produtos variáveis ​​WooCommerce " Código de resposta, no meu código abaixo, eu tenho um pro...

0  Como posso obter as dimensões do botão de imagem para fazer sentido no Android?  ( How can i get an image buttons dimensions to make sense in android ) 
Primeiro de tudo, posso apenas dizer, eu acho que deitando a UI do Android para ser uma experiência frustrante? Eu costumava pensar que os layouts XML eram si...

18  Encontre as dimensões de um array python multidimensional  ( Find the dimensions of a multidimensional python array ) 
em Python, é possível escrever uma função que retorna as dimensões de uma matriz multidimensional (dada a suposição de que as dimensões da matriz não são irre...

3  Array numpy perde dimensão após a tarefa / cópia, por quê?  ( Numpy array loses dimension upon assignment copy why ) 
Eu tenho o seguinte código: $yellow6 A saída é: $yellow7 Eu sei que o (comentado) reformule resolve o meu problema, no entanto, eu gostaria de ent...

0  Como ter um uiimageview como uma imagem de fundo de um UIView com um UIScrollView  ( How to have an uiimageview like a background image of an uiview with an uiscroll ) 
Eu tenho um UIView com um UIScrollView e um uiimageview como o fundo de UIView. Na viewDidLoad ter rolagem i usar este: CGSize scrollViewSize = [self.view ...

0  Use CSS para especificar dimensões de imagem no site WP da loja de inicialização?  ( Use css to specify image dimensions in boot store wp site ) 
Eu corri uma análise gtmetrix.com no meu site e disse que precisava especificar dimensões de imagem em algumas das imagens. O link para isso é: http://gtmetr...

1  Possível calcular a largura / altura de uma matriz girada?  ( Possible to calculate the width height of a rotated matrix ) 
Se eu usar isso: mCamera.rotateY(45); mCamera.getMatrix(mMatrix); mMatrix.preTranslate(-pivotX, -pivotY); mMatrix.postTranslate(pivotX + centerX, pivotY + ...

3  Carregando tabelas de dimensão - metodologias  ( Loading dimension tables methodologies ) 
Recentemente eu tenho trabalhado no projeto, onde precisamos preencher tabelas dimínas de tabelas EDW. Tabelas EDW são do tipo II que mantêm dados histórico...

0  Obtenha dimensões de imagem enviadas com JavaScript / JQuery?  ( Get uploaded image dimensions with javascript jquery ) 
também tente isso, mas para mim não está funcionando. Determinando o tamanho do arquivo de imagem + dimensões via javascript? . I Upload Image, insira-o ...

Perguntas relacionadas

2  Dimensão do cenário não relacionado SSAS 
0  Quaisquer plugins Cruiseecontrol para dimensões cm 
0  Dimensões de vídeo igual têm a mesma proporção 
1876  Como obter dimensões de tela como pixels no Android 
1  Adicionando um relacionamento no cubo olap 
4  As dimensões de um elemento são legíveis imediatamente após adicioná-lo à árvore Dom? 
3  C # System.Array Como contar ou encontrar quantas dimensões tem? 
2  Algoritmos de Dimensionalidade de Estado-da-arte 
1  Membros da dimensão do filtro e ajustar o membro 'todo' com base no filtro 
2  Descubra um conjunto de alta resolução de coordenadas? 
8  Existe de qualquer maneira para "embalar" um jpanel? 
29  Atribuindo 'Wrap_Content' ou '-2' à dimensão 
39  Obter dimensões de imagem com javascript antes de ser carregada totalmente 
1  Modelo de dados relacional no modelo de dados dimensional 
2  Como posso resolver essa matriz "Dimensões Matrix devem concordar"? 
107  Como definir o tamanho do texto usando a dimensão do XML no tempo de execução programaticamente? 
5  Cálculo de preço com base em dimensões na página de produto único WooCommerce 
0  Como posso obter as dimensões do botão de imagem para fazer sentido no Android? 
18  Encontre as dimensões de um array python multidimensional 
3  Array numpy perde dimensão após a tarefa / cópia, por quê? 
0  Como ter um uiimageview como uma imagem de fundo de um UIView com um UIScrollView 
0  Use CSS para especificar dimensões de imagem no site WP da loja de inicialização? 
1  Possível calcular a largura / altura de uma matriz girada? 
3  Carregando tabelas de dimensão - metodologias 
0  Obtenha dimensões de imagem enviadas com JavaScript / JQuery? 



© 2021 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.