J'essaie de calculer une quantité variable de pixels en pixels indépendants de la densité et vice-versa.
Cette formule (px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));
ne fonctionne pas sur les petits appareils car elle est divisée par zéro.
Voici ma formule dp en px:
px = (int)(dp * (displayMetrics.densityDpi / 160));
Quelqu'un pourrait-il me donner des conseils?
Réponses:
Remarque: la solution largement utilisée ci-dessus est basée sur
displayMetrics.density
. Cependant, la documentation explique que cette valeur est une valeur arrondie, utilisée avec l'écran «buckets». Par exemple. sur mon Nexus 10, il renvoie 2, où la valeur réelle serait 298 dpi (réel) / 160 dpi (par défaut) = 1,8625.En fonction de vos besoins, vous pourriez avoir besoin de la transformation exacte, qui peut être réalisée comme ceci:
[Modifier] Ceci n'est pas destiné à être mélangé avec l'unité dp interne d'Android, car cela est bien sûr toujours basé sur les seaux d'écran. Utilisez-le là où vous voulez une unité qui devrait rendre la même taille réelle sur différents appareils.
Convertir dp en pixel:
Convertir le pixel en dp:
Notez qu'il existe des propriétés xdpi et ydpi, que vous voudrez peut-être distinguer, mais je ne peux pas imaginer un affichage sain où ces valeurs diffèrent considérablement.
la source
J'ai résolu mon problème en utilisant les formules suivantes. Que d'autres personnes en bénéficient.
dp en px:
px à dp:
la source
px à dp:
la source
typedValue.applyDimension( TypedValue.COMPLEX_UNIT_PX, valueInDp , getResources() .getDisplayMetrics());
de PX à DP, c'est aussi la meilleure réponseapplyDimension
ne produit que des pixels. Voir android.googlesource.com/platform/frameworks/base/+/refs/heads/… pour lequel aucune conversion n'est effectuéeCOMPLEX_UNIT_PX
.dp
. Si vous regardez le code source, pour le casTypedValue.COMPLEX_UNIT_DIP
, ilvalue * metrics.density
est retourné là où vous en avez réellement besoinvalue * metrics.density
. Alors ce que vous getting` valueInDp` est pas dansdp
pourvalueInPx
enpx
.value / metrics.density
"Une manière efficace jamais
DP à Pixel:
Pixel à DP:
J'espère que ceci vous aidera.
la source
displayMetrics.xdpi
ce qui est différent sur n'importe quel appareil. Malheureusement, cette mauvaise réponse a également le plus de votes positifs.private fun dpToPx(dp: Int) = (dp * Resources.getSystem().displayMetrics.density).toInt()
Appelez simplement
getResources().getDimensionPixelSize(R.dimen.your_dimension)
pour convertir desdp
unités en pixelsla source
Utilisez cette fonction
la source
la source
(displayMetrics.densityDpi / 160)
- cette partie peut obtenir 0 sur les petits appareils, là, elle calcule par exemple120/160
, les deux valeurs sont int, ce qui donne 0. Ce qui se termine par(int) (px/0)
.Dans la plupart des cas, les fonctions de conversion sont fréquemment appelées. Nous pouvons l'optimiser en ajoutant la mémorisation. Ainsi, il ne calcule pas chaque fois que la fonction est appelée.
Déclarons un HashMap qui stockera les valeurs calculées.
Une fonction qui calcule les valeurs des pixels:
Une fonction de mémorisation qui renvoie la valeur de HashMap et conserve l'enregistrement des valeurs précédentes.
La mémorisation peut être implémentée de différentes manières en Java. Pour Java 7 :
Java 8 prend en charge la fonction Lambda :
Merci.
la source
essayez ceci http://labs.skinkers.com/content/android_dp_px_calculator/
la source
Les fonctions ci-dessous ont bien fonctionné pour moi sur tous les appareils.
Il est tiré de https://gist.github.com/laaptu/7867851
la source
Vous pouvez utiliser
[DisplayMatrics][1]
et déterminer la densité de l'écran. Quelque chose comme ça:Si je me souviens bien, il est préférable d'utiliser un revêtement de sol pour les décalages et l'arrondi pour les largeurs.
la source
Si vous recherchez une calculatrice en ligne pour convertir DP, SP, pouces, millimètres, points ou pixels entre eux à différentes densités d'écran, c'est l'outil le plus complet que je connaisse .
la source
// pour obtenir en termes de décimal / flottant
________________________________________________________________________________
la source
Utilisez ces extensions Kotlin:
la source
N'hésitez pas à utiliser cette méthode que j'ai écrite:
la source
La réponse acceptée ci-dessus n'est pas entièrement exacte. Selon les informations obtenues en inspectant le code source Android:
Resources.getDimension()
etgetDimensionPixelOffset()
/getDimensionPixelSize()
ne diffèrent que par le fait que le premier retournefloat
alors que les deux derniers renvoient la même valeur arrondie deint
manière appropriée. Pour tous, la valeur de retour est en pixels bruts.Les trois fonctions sont implémentées en appelant
Resources.getValue()
et en convertissant ainsi obtenuesTypedValue
en appelantTypedValue.complexToDimension()
,TypedValue.complexToDimensionPixelOffset()
etTypedValue.complexToDimensionPixelSize()
, respectivement.Par conséquent, si vous souhaitez obtenir une valeur "brute" avec l'unité spécifiée dans la source XML, appelez
Resources.getValue()
et utilisez les méthodes de laTypedValue
classe.la source
avec l'aide d'autres réponses, j'ai écrit cette fonction.
la source
Voici une autre façon de le faire en utilisant les extensions kotlin:
et puis il peut être utilisé comme ça de n'importe où
la source
la source
variation sur la réponse ct_robs ci-dessus, si vous utilisez des entiers, cela évite non seulement de diviser par 0, mais produit également un résultat utilisable sur de petits appareils:
dans les calculs d'entiers impliquant une division pour une plus grande précision, multipliez d'abord avant de diviser pour réduire les effets de troncature.
au lieu de
si vous voulez un résultat arrondi, faites ceci
la source