View.setPadding acepta solo en px, ¿hay alguna forma de setPadding en dp?

93

La función de Android View.setPadding(int left, int top, int right, int bottom)solo acepta valores en px pero quiero establecer el relleno en dp. ¿Hay alguna manera de evitarlo?

Sharj
fuente

Respuestas:

184

Directo al código

    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
fuente
1
Hola tengo una pregunta ¿Esta fórmula se usa solo para relleno o cualquier otra cosa? por ejemplo, ¿margen o dimensión de un rectángulo?
emeraldhieu
4
Esta es la fórmula para convertir unidades dp en unidades de píxeles . Puede usarlo en cualquier lugar
Labeeb Panampullan
2
Supongo que getResources()es una función heredada por una actividad, pero estoy tratando de usar estas líneas en un adaptador de vista de lista personalizado. ¿Hay alguna forma de que pueda hacer esto si no puedo llamar getResources()?
Mike Baxter
1
Desde su adaptador simplemente haga getContext (). GetResources (). GetDisplayMetrics (). Densidad;
Steve G.
4
¿Hay alguna explicación para el "+ 0.5f"?
Xavier L.
97

Si define la dimensión (en dp o lo que sea) en un archivo XML (que es mejor de todos modos, al menos en la mayoría de los casos), puede obtener el valor de píxel usando este código:

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

Hay una mejor manera de convertir valor a dp mediante programación:

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

Luego aplique dpValuea su método, por ejemplo:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
fuente
0

Tengo el mismo problema. La única solución que he encontrado (realmente no te ayudará :)) es configurarla en el archivo Xml.

Si puede obtener la densidad del código, puede utilizar la conversión: "La conversión de unidades de inmersión en píxeles de pantalla es simple: píxeles = inmersiones * (densidad / 160)". (de http://developer.android.com/guide/practices/screens_support.html )

Editar: puede obtener la densidad de la pantalla: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
fuente