La conversion des pixels de la dp
J'ai créé mon application avec la hauteur et la largeur en pixels, pour un Pantech appareil dont la résolution est de 480x800.
J'ai besoin de convertir la hauteur et la largeur pour un G1 appareil. J'ai pensé en le convertissant en dp va résoudre le problème et même solution pour les deux appareils.
Est-il un moyen facile de convertir les pixels en dp? Des suggestions?
- Si vous cherchez à faire une conversion (par exemple pour l'exportation de sprites à partir de Photoshop), voici une chouette converter.
px
,dp
,sp
les formules de conversion
Vous devez vous connecter pour publier un commentaire.
applyDimension
? Puis-je simplement fairegetResource().getDisplayMetrics()
, ou est-il autre chose?float pixelsPerDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, r.getDisplayMetrics()); return dp / pixelsPerDp;
Context
objet l'utilisationResources.getSystem().getDisplayMetrics()
Resource.getSystem()
(l'emphase est mienne): "de Retour d'un mondial de Ressources partagées objet qui fournit l'accès aux seules ressources du système (pas de demande de ressources), et n'est pas configuré pour l'écran actuel (ne peut pas utiliser la dimension des unités, ne change pas en fonction de l'orientation, etc)."DisplayMetrics.DENSITY_DEFAULT
au lieu de160f
developer.android.com/reference/android/util/...(metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)
sera de retour uneint
. Il doit être en fonte à double ou float.(float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT
vous pourriez tout aussi bien utilisermetrics.density
.context.getResources().getDisplayMetrics()
etResources.getSystem().getDisplayMetrics()
De préférence, mettre dans un Util.java classe
density
est égal à.75
surldpi
(120
dpi)1.0
surmdpi
(160
dpi; base)1.5
surhdpi
(240
dpi)2.0
surxhdpi
(320
dpi)3.0
surxxhdpi
(480
dpi)4.0
surxxxhdpi
(640
dpi)Utiliser cette convertisseur en ligne jouer avec les valeurs dpi.
EDIT:
Il semble que il n'y a pas de relation 1:1 entre
dpi
seau etdensity
. Il ressemble à laNexus 5X
êtrexxhdpi
a undensity
valeur de2.625
(au lieu de3
). Voyez par vous-même dans le Des Mesures De L'Appareil.Si vous pouvez utiliser les dimensions XML, c'est très simple!
Dans votre
res/values/dimens.xml
:Puis dans votre Java:
Selon le Développement Android Guide:
Mais souvent, vous aurez envie de faire effectuer cela dans l'autre sens lorsque vous recevez une conception qui est exprimée en pixels. Donc:
Si vous êtes sur un 240dpi appareil, ce ratio est de 1,5 (comme indiqué précédemment), ce qui signifie qu'un 60px icône est égal à 40dp dans l'application.
Vous pouvez utiliser cette .. sans Contexte
Comme @Stan dit .. à l'aide de cette approche pourrait poser problème si les modifications du système de la densité. Donc, être conscient de ce que!
Personnellement j'utilise le Contexte pour le faire.
Sans
Context
, élégant méthodes statiques:Resources.getSystem()
javadoc dit "de Retour d'un mondial de Ressources partagées objet qui fournit l'accès aux seules ressources du système (pas de demande de ressources), et n'est pas configuré pour l'écran actuel (ne peut pas utiliser la dimension des unités, ne change pas en fonction de l'orientation, etc)." Ce joli beaucoup dit que vous ne devriez pas faire ça, même si il fonctionne en quelque sorte.Pour
DP to Pixel
Créer une valeur dans
dimens.xml
Obtenir cette valeur en
pixel
comme:Par conséquent, vous pouvez utiliser les éléments suivants formulateur pour calculer la bonne quantité de pixels à partir d'une dimension spécifiée dans dp
convertToDp
.Pour toute personne utilisant les Kotlin:
Utilisation:
Il y a un défaut util dans android SDK:
http://developer.android.com/reference/android/util/TypedValue.html
resultPix
doit être de type int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
Cela devrait vous donner la conversion en dp en pixels:
Cela devrait vous donner la conversion en pixels de la dp:
Kotlin
Java
Probablement la meilleure façon, si vous avez de la dimension à l'intérieur de valeurs/dimen est d'obtenir la dimension directement à partir de getDimension() la méthode, il vous renvoie à la dimension déjà convertie en valeur de pixel.
Juste pour mieux expliquer cela,
sera le retour de la dimension déjà converti à pixel COMME UN FLOTTEUR.
sera de retour le même, mais tronqué à int, donc COMME UNE
ENTIER.
Voir Android de référence
à l'aide de kotlin-extension permet de mieux
Mise à JOUR:
En raison de
displayMetrics
fait partie de mondial de Ressources partagées, nous pouvons utiliserResources.getSystem()
Pour convertir dp du pixel.
Pour convertir les pixels de la dp.
où la ressource est le contexte.getResources().
comme ceci:
dépend du Contexte, de retour de valeur float, méthode statique
à partir de: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
Dans le cas où vous développer une critique pour les performances de l'application, veuillez considérer ce qui suit optimisé classe:
Plus élégant approche à l'aide de kotlin de la fonction d'extension de
Utilisation:
16.px
En fait, les moyens, pas les 16 et non px, lol.function name
" que je réalise est à l'envers dans ce cas. Pour clarifier chaque fonction de l'intention, les noms des fonctions pourrait être mis à jour pour lire dpToPx et pxToDp, respectivement.pour convertir les Pixels en dp utiliser le TypedValue .
Que la documentation mentionnée : Conteneur pour un typées dynamiquement les données de la valeur .
et l'utilisation de la applyDimension méthode :
qui Convertit une déballé de données complexes valeur la tenue d'une dimension à sa dernière valeur en virgule flottante comme suit :
Espère que ça Aide .
C'est la façon dont il fonctionne pour moi:
Vous pouvez faire de même pour la largeur.
Vous devez utiliser des dp comme vous le feriez pixels. C'est tout ce qu'ils sont; affichage de pixels indépendants. Utiliser les mêmes numéros que vous le feriez sur une densité moyenne de l'écran, et la taille sera magiquement correcte sur une haute densité de l'écran.
Cependant, il semble que vous avez besoin est la fill_parent option dans votre conception de mise en page. Utilisation fill_parent lorsque vous souhaitez que votre point de vue ou de contrôle de l'étendre à tout le reste de la taille du conteneur parent.
Beaucoup de solutions ci-dessus. Toutefois, la meilleure solution que j'ai trouvé est de google de conception:
https://design.google.com/devices/
PX
etDP
sont différents, mais semblables.DP
est la résolution lorsque vous seul facteur de la taille physique de l'écran. Lorsque vous utilisezDP
il va mettre à l'échelle votre disposition pour d'autres de même taille des écrans avec de différentspixel
densités.Parfois, vous voulez vraiment
pixels
si, et quand vous avez affaire avec des dimensions dans le code, vous aurez toujours affaire à de vraispixels
, à moins que vous les convertir.Donc sur un appareil android, taille normale,
hdpi
écran,800x480 is 533x320
dansDP
(je crois). Pour convertirDP
enpixels /1.5
, de se reconvertir*1.5
. Ce n'est que pour une taille d'écran et dedpi
, il serait de changer en fonction de la conception. Nos artistes me donnerpixels
et si je convertirDP
ci-dessus1.5
équation.Ce workds pour moi (C#):
Si vous voulez Entier valeurs, puis en utilisant les Mathématiques.round() arrondit le flotteur à l'entier le plus proche.
kotlin
java
Pour Xamarin.Android
Ce qui en fait un non-statique est nécessaire lorsque vous faites un moteur de rendu personnalisé
Pour convertir
dp to px
ce code peut être utile :HTML:
Pour Réagir code Java Natif il y a déjà un util de classe: