Criei alguns elementos personalizados e quero colocá-los programaticamente no canto superior direito ( n
pixels da borda superior e m
pixels da borda direita). Portanto, preciso obter a largura e a altura da tela e definir a posição:
int px = screenWidth - m;
int py = screenHeight - n;
Como recebo screenWidth
e screenHeight
na Atividade principal?
getMetrics
. O comentário de Nik em sua resposta até explicagetDisplayMetrics
para considerar o tamanho da barra de sistema / status. Além disso, você pode usar a densidade como jmaculate e LoungeKatt explicou ter a EXATO valor:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
Testado em v2.2 Android (API 8) e v4.0 com bons resultados e sem erros / avisos .Resources.getSystem().getDisplayMetrics()
. Você não precisará de umContext
para obtê-los.Respostas:
Se você quiser as dimensões de exibição em pixels, poderá usar
getSize
:Se você não estiver em um,
Activity
pode obter o padrãoDisplay
viaWINDOW_SERVICE
:Se você estiver em um fragmento e deseja realizar isso, use Activity.WindowManager (em Xamarin.Android) ou getActivity (). GetWindowManager () (em java).
Antes
getSize
foi introduzida (em nível de API 13), você pode usar ogetWidth
egetHeight
métodos que agora estão obsoletos:No entanto, para o caso de uso que você está descrevendo, uma margem / preenchimento no layout parece mais apropriada.
Outra maneira é: DisplayMetrics
Podemos usar
widthPixels
para obter informações sobre:Exemplo:
fonte
try/catch
para esse cheque? Por que não usar simplesmenteif (android.os.Build.VERSION.SDK_INT >= 13)
sem nenhuma exceção lançada? Pensotry/catch
em um fluxo de aplicativo normal como uma prática ruim.Uma maneira é:
Ele está obsoleto e você deve tentar o seguinte código. As duas primeiras linhas de código fornecem os
DisplayMetrics
objetivos. Esta objetos contém campos comoheightPixels
,widthPixels
.fonte
Pode não responder à sua pergunta, mas pode ser útil saber (eu estava procurando por mim quando cheguei a essa pergunta) que, se você precisar da dimensão de um View, mas seu código estiver sendo executado quando o layout ainda não estiver definido. (por exemplo, em
onCreate()
), você pode configurar umViewTreeObserver.OnGlobalLayoutListener
comView.getViewTreeObserver().addOnGlobalLayoutListener()
e colocar o código relevante que precisa da dimensão da visualização. O retorno de chamada do ouvinte será chamado quando o layout tiver sido definido.fonte
View.post()
não é garantido que funcione? Estou curioso, porque também confio neste método para obter o tamanho de uma visualização após o layout e não o sabia.View
você éViewTreeObserver
? Ou todos eles compartilham o mesmo?(Resposta de 2012, pode estar desatualizada) Se você deseja oferecer suporte ao Honeycomb pré, precisará colocar uma compatibilidade com versões anteriores à API 13. Algo como:
É claro que os métodos descontinuados acabarão sendo retirados dos SDKs mais recentes, mas, embora ainda contemos com a maioria dos usuários com Android 2.1, 2.2 e 2.3, é isso que nos resta.
fonte
Tentei todas as "soluções" possíveis sem êxito e notei que o aplicativo "Dalvik Explorer" de Elliott Hughes sempre mostra a dimensão correta em qualquer versão de dispositivo / sistema operacional Android. Acabei analisando seu projeto de código aberto que pode ser encontrado aqui: https://code.google.com/p/enh/
Aqui está todo o código relevante:
EDIT: versão ligeiramente melhorada (evite disparar exceções na versão do sistema operacional não suportada):
fonte
Maneira mais simples:
fonte
Para acessar a altura da barra de status para dispositivos Android, preferimos uma maneira programática de obtê-lo:
Código de amostra
A variável
result
fornece a altura no pixel.Para acesso rápido
Para mais informações sobre a altura de
Title bar
,Navigation bar
eContent View
, olhar com bons olhos Android tamanhos de tela do dispositivo .fonte
getResources().getDisplayMetrics().heightPixels + result
fornece a altura real da tela cheia. A resposta de Dragan Marjanović também funciona, mas eu prefiro essa solução muito mais curta e mais simples.OnApplyWindowInsetsListener
.Primeiro obtenha a view (por exemplo, by
findViewById()
) e então você pode usar getWidth () na própria view.fonte
Eu tenho duas funções, uma para enviar o contexto e outra obtendo altura e largura em pixels:
e
fonte
@SuppressLint("NewApi")
logo acima da assinatura da função para poder compilar.Para dimensionar dinamicamente usando XML, existe um atributo chamado "android: layout_weight"
O exemplo abaixo, modificado a partir da resposta da synic nesse segmento , mostra um botão que ocupa 75% da tela (peso = 0,25) e uma exibição de texto ocupa os 25% restantes da tela (peso = 0,75).
fonte
Este é o código que eu uso para a tarefa:
Parece bastante limpo e, no entanto, cuida da depreciação.
fonte
Não é uma solução muito melhor? O DisplayMetrics vem com tudo o que você precisa e funciona a partir da API 1.
Você também pode obter a exibição real (incluindo decorações de tela, como Barra de Status ou barra de navegação do software) usando getRealMetrics , mas isso funciona apenas para 17 anos.
Estou esquecendo de algo?
fonte
Apenas adicionando à resposta de Francesco. O outro observador que é mais apto, se você deseja descobrir o local na janela ou local na tela é ViewTreeObserver.OnPreDrawListener ()
Isso também pode ser usado para encontrar outros atributos de uma exibição que é quase desconhecida no momento do onCreate (), por exemplo, a posição rolada, a posição escalada.
fonte
Usando o seguinte código em Atividade.
fonte
Encontre a largura e a altura da tela:
Com isso, podemos obter o SDK 13 mais recente e acima.
fonte
fonte
Eu achei que isso fez o truque.
fonte
É preciso dizer que, se você não estiver dentro
Activity
, mas dentroView
(ou tiver uma variável doView
tipo em seu escopo), não será necessário usarWINDOW_SERVICE
. Então você pode usar pelo menos duas maneiras.Primeiro:
Segundo:
Todos esses métodos que chamamos aqui não são preteridos.
fonte
fonte
Para obter as dimensões da tela, use as métricas de exibição
Obter a altura e largura em pixels
fonte
Esta não é uma resposta para o OP, pois ele queria as dimensões da tela em pixels reais. Eu queria as dimensões em "pixels independentes de dispositivo", e reuni respostas aqui https://stackoverflow.com/a/17880012/253938 e aqui https://stackoverflow.com/a/6656774/253938 eu vim com isso:
fonte
Você pode obter o tamanho da altura usando:
e o tamanho da largura usando
fonte
Existe uma maneira não obsoleta de fazer isso usando o DisplayMetrics (API 1), que evita a confusão de tentar / capturar:
fonte
Gostaria de quebrar o código getSize assim:
fonte
Para quem está pesquisando a dimensão da tela utilizável sem a barra de status e a barra de ação (também graças à resposta do Swapnil):
fonte
Primeiro carregue o arquivo XML e, em seguida, escreva este código:
Mostrar largura e altura de acordo com a resolução da tela.
fonte
Siga os métodos abaixo:
fonte
Kotlin
fonte
Há momentos em que você precisa conhecer as dimensões precisas do espaço disponível para um layout no onCreate de uma atividade. Depois de pensar um pouco, trabalhei dessa maneira.
Se, por algum motivo, você não quiser adicionar outra atividade ao manifesto do Android, poderá fazê-lo desta maneira:
fonte
Se você não deseja a sobrecarga de WindowManagers, Points ou Displays, pode pegar os atributos de altura e largura do item de exibição mais alto no seu XML, desde que a altura e a largura estejam definidas como match_parent. Isso é verdade desde que seu layout ocupe a tela inteira.
Por exemplo, se o seu XML começar com algo como isto:
Em seguida
findViewById(R.id.entireLayout).getWidth()
, retornará a largurafindViewById(R.id.entireLayout).getHeight()
da tela e a altura da tela.fonte