Eu criei meu aplicativo com a altura e largura fornecidas em pixels para um dispositivo Pantech cuja resolução é 480x800
.
Preciso converter altura e largura para um dispositivo G1.
Eu pensei que convertê-lo em dp resolverá o problema e fornecerá a mesma solução para os dois dispositivos.
Existe alguma maneira fácil de converter pixels em dp?
Alguma sugestão?
android
pixel
resolution
dpi
Indhu
fonte
fonte
px
,dp
,sp
Fórmulas de conversãoRespostas:
fonte
applyDimension
? Posso fazergetResource().getDisplayMetrics()
ou há algo mais?Context
uso de objetoResources.getSystem().getDisplayMetrics()
fonte
Resource.getSystem()
(ênfase minha): "Retorne um objeto Global compartilhado de Recursos que fornece acesso apenas aos recursos do sistema (sem recursos de aplicativos) e não está configurado para a tela atual ( não pode usar unidades de dimensão , não muda com base na orientação, etc) ".DisplayMetrics.DENSITY_DEFAULT
em vez de160f
developer.android.com/reference/android/util/...Coloque preferencialmente em uma classe Util.java
fonte
density
é igual a.75
ativadoldpi
(120
dpi)1.0
ativadomdpi
(160
dpi; linha de base)1.5
ativadohdpi
(240
dpi)2.0
ativadoxhdpi
(320
dpi)3.0
ativadoxxhdpi
(480
dpi)4.0
ativadoxxxhdpi
(640
dpi)Use este conversor online para brincar com os valores de dpi.
EDIT: Parece que não há relação 1: 1 entre
dpi
bucket edensity
. Parece que oNexus 5X
serxxhdpi
tem umdensity
valor de2.625
(em vez de3
). Veja você mesmo nas Métricas do dispositivo .fonte
Você pode usar isso .. sem contexto
Como o @Stan mencionou .. usar essa abordagem pode causar problemas se o sistema alterar a densidade. Então, fique ciente disso!
Pessoalmente, estou usando o Contexto para fazer isso. É apenas outra abordagem com a qual eu queria compartilhar você
fonte
Se você pode usar o XML das dimensões, é muito simples!
No seu
res/values/dimens.xml
:Então no seu Java:
fonte
De acordo com o Guia de desenvolvimento do Android:
Mas, muitas vezes, você deseja fazer isso de maneira inversa ao receber um design declarado em pixels. Assim:
Se você estiver em um dispositivo de 240 dpi, essa proporção é de 1,5 (como mencionado anteriormente), então isso significa que um ícone de 60px é igual a 40dp no aplicativo.
fonte
Sem
Context
métodos estáticos elegantes:fonte
Resources.getSystem()
javadoc diz "Retorne um objeto Global compartilhado de Recursos que fornece acesso apenas aos recursos do sistema (sem recursos do aplicativo) e não está configurado para a tela atual (não pode usar unidades de dimensão, não muda com base na orientação, etc.)." Isso praticamente diz que você não deveria fazer isso, mesmo que de alguma forma funcione.Para
DP to Pixel
Crie um valor em
dimens.xml
Obtenha esse valor
pixel
como:fonte
Portanto, você pode usar o formulador a seguir para calcular a quantidade correta de pixels de uma dimensão especificada em dp
fonte
convertToDp
.Para quem usa o Kotlin:
Uso:
fonte
Há um utilitário padrão no SDK do Android: http://developer.android.com/reference/android/util/TypedValue.html
fonte
resultPix
deve ser do tipo int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
usando o kotlin-extension torna melhor
ATUALIZAR:
Como
displayMetrics
faz parte dos Recursos compartilhados globais , podemos usarResources.getSystem()
fonte
Isso deve fornecer a conversão dp para pixels:
Isso deve fornecer os pixels de conversão para dp:
fonte
Kotlin
Java
fonte
Provavelmente, a melhor maneira de obter a dimensão dentro de values / dimen é obtendo a dimensão diretamente do método getDimension (), ela retornará a dimensão já convertida em valor de pixel.
Apenas para explicar melhor isso,
retornará a dimensão já convertida em pixel AS A FLOAT.
retornará o mesmo, mas truncado para int, portanto AS INTEGER.
Consulte referência Android
fonte
onde o recurso é context.getResources ().
fonte
como isso:
dependente do contexto, retornar valor flutuante, método estático
from: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
fonte
Abordagem mais elegante usando a função de extensão do kotlin
Uso:
fonte
function name
", que eu percebo que estão ao contrário neste caso. Para esclarecer a intenção de cada função, os nomes das funções podem ser atualizados para ler dpToPx e pxToDp, respectivamente.fonte
Caso esteja desenvolvendo um aplicativo crítico de desempenho, considere a seguinte classe otimizada:
fonte
para converter pixels em dp, use o TypedValue .
Conforme a documentação mencionada: Contêiner para um valor de dados digitado dinamicamente.
e use o método applyDimension :
que Converte um valor de dados complexos descompactado, mantendo uma dimensão em seu valor final de ponto flutuante, como o seguinte:
Espero que ajude .
fonte
É assim que funciona para mim:
Você pode fazer o mesmo para a largura.
fonte
Muitas ótimas soluções acima. No entanto, a melhor solução que encontrei é o design do google:
https://design.google.com/devices/
fonte
Você deve usar o dp como faria com os pixels. Isso é tudo o que são; exibir pixels independentes. Use os mesmos números que você usaria em uma tela de densidade média e o tamanho estará magicamente correto em uma tela de alta densidade.
No entanto, parece que você precisa da opção fill_parent no seu design de layout. Use fill_parent quando desejar que sua visualização ou controle se expanda para todo o tamanho restante no contêiner pai.
fonte
PX
eDP
são diferentes, mas semelhantes.DP
é a resolução quando você considera apenas o tamanho físico da tela. Ao usá-DP
lo, o layout será dimensionado para outras telas de tamanhos semelhantes compixel
densidades diferentes .Ocasionalmente, você realmente deseja
pixels
, e quando lida com dimensões no código, está sempre lidando com realpixels
, a menos que as converta.Então, em um dispositivo Android,
hdpi
tela de tamanho normal ,800x480 is 533x320
emDP
(eu acredito). Para converterDP
empixels /1.5
, para converter de volta*1.5
. Isso é apenas para o tamanho de uma tela edpi
isso mudaria dependendo do design.pixels
Porém, nossos artistas me deram e eu me convertiDP
com a1.5
equação acima .fonte
Se você deseja valores inteiros , usar Math.round () arredondará o valor flutuante para o número inteiro mais próximo.
fonte
A melhor resposta vem da própria estrutura do Android: basta usar essa igualdade ...
(converte dp em px)
fonte
Isso funciona para mim (C #):
fonte
kotlin
Java
fonte