View.setPadding accepte uniquement en px, existe-t-il de toute façon setPadding dans dp?

93

La fonction Android View.setPadding(int left, int top, int right, int bottom)n'accepte que les valeurs en px mais je souhaite définir un remplissage dans dp. Y a-t-il un moyen de contourner cela?

Sharj
la source

Réponses:

184

Directement au code

    int padding_in_dp = 6;  // 6 dps
    final float scale = getResources().getDisplayMetrics().density;
    int padding_in_px = (int) (padding_in_dp * scale + 0.5f);
Labeeb Panampullan
la source
1
Salut, j'ai une question. Cette formule est-elle utilisée uniquement pour le rembourrage ou autre chose? par exemple, marge ou dimmension d'un rectangle?
emeraldhieu
4
C'est la formule de conversion des unités dp en unités de pixels . Vous pouvez l'utiliser n'importe où
Labeeb Panampullan
2
Je suppose que getResources()c'est une fonction héritée par une activité, mais j'essaie d'utiliser ces lignes dans un adaptateur de listview personnalisé. Puis-je faire cela si je ne peux pas appeler getResources()?
Mike Baxter
1
Depuis votre adaptateur, faites simplement getContext (). GetResources (). GetDisplayMetrics ().
Steve G.15
4
Y a-t-il une explication quelque part pour le "+ 0.5f"?
Xavier L.
97

Si vous définissez la dimension (en dp ou autre) dans un fichier XML (ce qui est mieux de toute façon, du moins dans la plupart des cas), vous pouvez en obtenir la valeur en pixels en utilisant ce code:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
Michael Sparmann
la source
3

Il existe un meilleur moyen de convertir la valeur en dp par programme:

int value = 200;
int dpValue = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            value,        
            context.getResources().getDisplayMetrics());

Appliquez ensuite dpValueà votre méthode, par exemple:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
la source
0

J'ai le même problème. La seule solution que j'ai trouvée (cela ne vous aidera pas vraiment :)) est de le définir dans le fichier Xml.

Si vous pouvez obtenir la densité à partir du code, vous pouvez utiliser la conversion: "La conversion des unités de creux en pixels d'écran est simple: pixels = creux * (densité / 160)." (à partir de http://developer.android.com/guide/practices/screens_support.html )

Edit: vous pouvez obtenir la densité de l'écran: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
la source