Preciso codificar o layout dos widgets do Android usando dip / dp (em arquivos java). Em tempo de execução, se eu codificar
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
isso retorna a largura da tela em pixels (px). Para converter isso em dp, eu codifiquei:
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
Isso não parece estar retornando a resposta correta. Eu criei o emulador de WVGA800, cuja resolução de tela é de 480 por 800. Quando o emulador é executado e o código imprime os valores de pixel e dp, chegou a 320 em ambos. Este emulador é de 240 dpi cujo fator de escala seria 0,75.
android
density-independent-pixel
Khushboo
fonte
fonte
Eu me deparei com essa pergunta do Google e, mais tarde, encontrei uma solução fácil, válida para a API> = 13.
Para referências futuras:
Consulte Referência da classe de configuração
Editar: Como observado por Nick Baicoianu, isso retorna a largura / altura utilizável da tela (que devem ser as mais interessantes na maioria dos usos). Se você precisar das dimensões reais da tela, atenha-se à resposta superior.
fonte
Está faltando o valor de densidade padrão 160.
Em outras palavras, se você projetar seu layout com largura igual a 160dip no modo retrato, será metade da tela em todos os dispositivos ldpi / mdpi / hdpi (exceto os tablets, eu acho)
fonte
DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
dentro de Activity. Em seguida,outMetrics.density
fornecerá o fator de escala do dispositivo atual, conforme declarado na documentaçãoQue tal usar isso?
fonte
fonte
Resposta em kotlin:
fonte
Simplificado para Kotlin:
fonte
Obtenha largura e altura da tela em termos de DP com uma boa decoração:
Etapa 1: criar interface
Etapa 2: criar classe de implementador
Etapa 3: obtenha largura e altura na atividade:
fonte
Se você quer apenas saber sobre a largura da tela, basta pesquisar por "menor largura de tela" nas opções do desenvolvedor. Você pode até editá-lo.
fonte
Tente o seguinte:
fonte
Seu problema está em converter o float para um int, perdendo precisão. Você também deve multiplicar com o fator e não dividir.
Faça isso:
fonte