View.setPadding akceptuje tylko w px, czy w ogóle istnieje możliwość setPadding w dp?

94

Funkcja Androida View.setPadding(int left, int top, int right, int bottom)akceptuje tylko wartości w px, ale chcę ustawić dopełnienie w dp. Czy można to obejść?

Sharj
źródło

Odpowiedzi:

186

Prosto do kodu

    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
źródło
1
Cześć, mam pytanie. Czy ta formuła jest używana tylko do wypełnienia, czy do czegokolwiek innego? np. margines lub wymiar prostokąta?
emeraldhieu
4
To jest wzór na konwersję jednostek dp na jednostki pikseli . Możesz go używać wszędzie
Labeeb Panampullan,
2
Zakładam, że getResources()jest to funkcja dziedziczona przez działanie, ale próbuję użyć tych wierszy w niestandardowym adapterze widoku listy. Czy jest jakiś sposób, w jaki mogę to zrobić, jeśli nie mogę zadzwonić getResources()?
Mike Baxter
1
Z adaptera po prostu wykonaj getContext (). GetResources (). GetDisplayMetrics (). Density;
Steve G.,
4
Czy jest gdzieś wyjaśnienie „+ 0,5f”?
Xavier L.
100

Jeśli zdefiniujesz wymiar (w dp lub czymkolwiek) w pliku XML (co i tak jest lepsze, przynajmniej w większości przypadków), możesz uzyskać wartość piksela za pomocą tego kodu:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
Michael Sparmann
źródło
3

Jest lepszy sposób na programowe przekonwertowanie wartości na dp:

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

Następnie zastosuj się dpValuedo swojej metody, na przykład:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
źródło
0

Mam ten sam problem. Jedynym rozwiązaniem, które znalazłem (nie pomoże Ci to :)) jest ustawienie go w pliku Xml.

Jeśli możesz uzyskać gęstość z kodu, możesz użyć konwersji: „Konwersja jednostek zanurzenia na piksele ekranu jest prosta: piksele = spadki * (gęstość / 160)”. (z http://developer.android.com/guide/practices/screens_support.html )

Edycja: możesz uzyskać gęstość ekranu: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
źródło