52 votes

Différence entre android dimension: cp et dp

La documentation dit que 160 dp (indépendante de la densité) est égal à 1 pouce. Et 72 pt est de 1 pouce. Donc je ne vois pas pourquoi android définir un dp de mesure tandis qu'il semble que cela fonctionne de la même comme des points. Quelqu'un peut-il expliquer cela? Pourquoi devrais-je utiliser dp si je peux utiliser le pt?

75voto

John Leehey Points 10405

La Android la documentation utilisée à tort que 160 dp est toujours égale à 1 pouce, indépendamment de la densité de l'écran. Cela a été rapporté comme un bug qui a été acceptée et la documentation mise à jour.

À partir de la documentation mise à jour:

160 dp ne sera PAS toujours égal à 1 pouce, il variera en fonction des différentes tailles d'écran et des densités. Sur un écran avec une densité de 160dpi (mdpi), 160 dp sera égal à 1 cm.

1 pt est toujours égale à 1 / 72ème, indépendamment de la densité de l'écran.

L'Android de la documentation pour ce est ici.

Mise à JOUR:

J'ai fait une petite application pour essayer et vérifier les différentes tailles. Il ressemble à ce qui est ci-dessus est correcte, au moins quand elles sont visibles sur mon HTC Aria. Voici une capture d'écran:

HTC Aria resource type test

Il est intéressant de noter que ces tailles ne correspondent PAS exactement à l'éclipse d'un éditeur graphique. Le dp et sp tailles faibli en fonction de la taille de l'écran et de la résolution de l'éditeur. Voici quelques captures d'écran de l'éditeur (de gauche est de 2,7 en QVGA curseur, à droite 10.1 WXGA, découpée):

enter image description here

Il serait intéressant de voir si ces éditeur rend correspondre avec les dispositifs. Quelqu'un peut-il vérifier ces tailles? Je vais joindre mon xml ci-dessous au cas où quelqu'un veut bien vous aider.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:orientation="vertical">
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="160dp"></TextView>
    <View android:id="@+id/view1" android:layout_height="20dip" android:layout_width="160dp" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
    <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="72pt"></TextView>
    <View android:id="@+id/view2" android:layout_height="20dip" android:layout_width="72pt" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
    <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="1in"></TextView>
    <View android:id="@+id/View01" android:layout_height="20dip" android:layout_width="1in" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
    <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:text="160sp" android:padding="5sp" android:id="@+id/TextView01"></TextView>
    <View android:layout_marginLeft="20sp" android:layout_width="160sp" android:id="@+id/View04" android:background="#FF22FF22" android:layout_height="20dip"></View>
    <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:padding="5sp" android:id="@+id/TextView02" android:text="160px"></TextView>
    <View android:layout_marginLeft="20sp" android:id="@+id/View03" android:background="#FF22FF22" android:layout_height="20dip" android:layout_width="160px"></View>
    <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="25.4mm"></TextView>
    <View android:id="@+id/View02" android:layout_height="20dip" android:layout_marginLeft="20sp" android:background="#FF22FF22" android:layout_width="25.4mm"></View>
</LinearLayout>

Edit: Ajouté 2 appareils de Jean exemple. Sur la gauche un Samsung Nexus S (OS 2.3.3). Sur la droite, un Samsung Galaxy Tab 10.1 (OS 3.1). Pas de mods.

Samsung Nexus SSamsung Galaxy Tab 10.1

Sur le Nexus S, 160dp est légèrement plus grand que 1 pouce. Normal que toutes les unités physiques de (in, mm, pt) sont toutes de la même taille. Je l'ai mesuré avec une règle, et la 160 dp bar est d'environ 1 mm de plus qu'il ne le devrait. Tandis que les unités physiques sont de 1 mm plus courte que ce qu'ils devraient.

Sur l'Onglet, tous les bars sont exactement les mêmes, et 1mm de plus que ce que j'ai mesuré avec une règle.

38voto

Steven Byle Points 4888

La documentation dit que 160 dp (indépendante de la densité) est égal à 1 pouce. Et 72 pt est de 1 pouce.

La nuance ici est que 160 dp (ou dip) est d'environ 1 pouce, tandis que 72 pt est exactement de 1 pouce. La différence est la façon dont android convertit les deux unités de pixels, ce qui dépend de la densité de l'écran de l'appareil.


Un seul dp est un seul px sur un appareil à 160 dpi. Android utilise la "densité de seau" de l'appareil tombe dans l', et multiplie un convertisseur pour convertir dp de px.

Bucket | DPI | Scaler
---------------------
ldpi   | 120 | 0.75
mdpi   | 160 | 1.00
tvdpi  | 213 | 1.33
hdpi   | 240 | 1.50
xhdpi  | 320 | 2.00
xxhdpi | 480 | 3.00

dp de px convertit suivant cette formule: dp * scaler = px.


Un seul pt est exactement à 1/72 de pouce sur l'écran de la densité. Android convertit pt de px en utilisant exactement les dpi (xdpi et ydpi) de l'écran de l'appareil.

pt de px convertit suivant cette formule: pt / 72 * dpi = px.


Donc je ne vois pas pourquoi android définir un dp de mesure tandis qu'il semble que cela fonctionne de la même comme des points. Quelqu'un peut-il expliquer cela? Pourquoi devrais-je utiliser dp si je peux utiliser le pt?

Prenons un exemple, l'affichage de 160 dp et 72 pt sur un périphérique à 160 ppp. 160 dpi appareil tombe dans l'mdpi densité seau, avec un scaler de 1.0. Utiliser les formules ci-dessus pour convertir px.

160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px

Ce sujet sur 170 dpi appareil? Un 170 dpi appareil tombe dans l'mdpi densité seau, avec un scaler de 1.0.

160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px

Ce sujet sur un 150 dpi appareil? 150 dpi appareil tombe dans l'mdpi densité seau, avec un scaler de 1.0.

160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px

La morale de l'histoire est, dp conserve les dimensions exactes et aide à maintenir la performance, permettant une variation de la taille en fonction de la densité. D'autre part, pt est exactement la même taille physique sur chaque densité, ce qui conduit à un montant différent de px être utilisé, ce qui peut gêner la performance et de la cause de l'aliasing et des artefacts si elle est utilisée sur les images. dp est recommandée, sauf si absolument exact dimensions physiques sont nécessaires (vous avez une règle sur l'écran, etc).

J'ai écrit un blog détaillées sur Android dimension des unités, ce qui donne plus d'infos et des exemples de code - Compréhension de la Densité de l'Indépendance dans Android

3voto

howettl Points 3024

Par curiosité, j'ai essayé la mise en page de Jean de réponse sur mes deux appareils: Asus transformer (10.1) et HTC Legend (3.2). Les résultats ont été assez intéressant:

Transformateur (rognée):

Transformer

Et La Légende:

Legend

3voto

gcbound Points 328

J'ai lutté avec les dimensions, mais je crois que j'ai trouvé une façon de voir les choses qui fait sens pour moi. Il y a une formule de conversion en Wei-Lee Meng "à partir d'Android 4 le Développement de l'Application" (page 111):

Taille réelle des pixels = dp * ( dpi / 160 ), où le dpi est 120, 160, 240 ou 320

Donc, en utilisant cette formule, je peux trouver la résolution dpi pour mon téléphone/émulateur est le plus proche de l'une de ces quatre valeurs, et qui va déterminer le rapport (3/4, 1, 3/2 ou 2) utilisé dans la formule pour convertir les dp de pixels. C'est important pour moi que le dpi dans la formule ne peut que supposer une de ces quatre valeurs en dépit de l'appareil réel de la densité de pixels.

Référence: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_densitypour un Nexus S avec une densité de pixel de 235 ppp de la conversion est la suivante:

pixels = dp * 3/2

Ainsi, un 160dp bouton, par exemple, être 240px (un peu plus large que d'un pouce avec l'appareil 235 ppp)

Pour un HTC Legend, avec une densité de pixel de 181 dpi, la formule est:

pixels = dp * 1

(parce que 181 est le plus proche de 160). De sorte que 160dp bouton serait 160pixels, ou un peu moins de un pouce sur l'appareil, avec sa densité de pixels de 181dpi.

Cela m'aide à comprendre l'inexactitude de la précédente Android documentation "1 dp est toujours égale à 1/160in, indépendamment de la densité de l'écran".

Ce sont les deux points principaux que j'essaie de faire dans ma tête :)

  1. une gamme de périphérique réel densités de pixels (par exemple: 141-199) résultat sera le même ratio (1) dans la formule de conversion
  2. mais, à moins que la densité de pixels d'un dispositif particulier est exactement 160 dpi, l'160 dp ne sera pas d'un pouce sur l'appareil...fermer au-dessus ou au-dessous, mais pas exactement

3voto

Subayan Points 26

pt Points - 1/72 de pouce sur la taille physique de l'écran.

dp Indépendante de la densité de Pixels - un résumé de l'unité qui est basé sur la densité physique de l'écran. Ces unités sont relatifs à un 160 dpi de l'écran, donc un dp est un pixel sur un 160 dpi de l'écran. Le ratio de la dp-à-pixel va changer avec la densité de l'écran, mais pas nécessairement en proportion directe. Remarque: Le compilateur accepte à la fois les "dip" et "dp", bien que "dp" est plus compatible avec le "sp".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X