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?
Réponses
Trop de publicités?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:
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):
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.
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.
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
(oudip
) est d'environ 1 pouce, tandis que 72pt
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 seulpx
sur un appareil à 160 dpi. Android utilise la "densité de seau" de l'appareil tombe dans l', et multiplie un convertisseur pour convertirdp
depx
.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
depx
convertit suivant cette formule:dp * scaler = px
.Un seul
pt
est exactement à 1/72 de pouce sur l'écran de la densité. Android convertitpt
depx
en utilisant exactement les dpi (xdpi et ydpi) de l'écran de l'appareil.
pt
depx
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 72pt
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 convertirpx
.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 depx
ê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
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 :)
- 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
- 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
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".