View.setPadding aceita apenas em px, há alguma maneira de setPadding em dp?

92

A função Android View.setPadding(int left, int top, int right, int bottom)só aceita valores em px, mas quero definir o preenchimento em dp. Existe alguma maneira de contornar isso?

Sharj
fonte

Respostas:

184

Direto para o 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
fonte
1
Oi, eu tenho uma pergunta. Esta fórmula é usada apenas para preenchimento ou qualquer outra coisa? por exemplo, margem ou dimensão de um retângulo?
emeraldhieu
4
Esta é a fórmula para converter unidades dp em unidades de pixel . Você pode usá-lo em qualquer lugar
Labeeb Panampullan
2
Presumo que getResources()seja uma função herdada por uma atividade, mas estou tentando usar essas linhas em um adaptador de visualização de lista personalizado. Existe alguma maneira de fazer isso se não puder ligar getResources()?
Mike Baxter,
1
Em seu adaptador, basta fazer getContext (). GetResources (). GetDisplayMetrics (). Densidade;
Steve G.
4
Existe uma explicação em algum lugar para o "+ 0.5f"?
Xavier L.
96

Se você definir a dimensão (em dp ou qualquer outro) em um arquivo XML (o que é melhor de qualquer maneira, pelo menos na maioria dos casos), você pode obter o valor de pixel usando este código:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
Michael Sparmann
fonte
2

Existe uma maneira melhor de converter valor em dp programaticamente:

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

Em seguida, aplique dpValueao seu método, por exemplo:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
fonte
0

Tenho o mesmo problema. A única solução que encontrei (realmente não vai te ajudar :)) é configurá-lo no arquivo Xml.

Se você pode obter a densidade do código, pode usar a conversão: "A conversão de unidades de mergulho em pixels da tela é simples: pixels = quedas * (densidade / 160)." (de http://developer.android.com/guide/practices/screens_support.html )

Editar: você pode obter a densidade da tela: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
fonte