View.setPadding yalnızca px cinsinden kabul eder, dp'de setPadding'i yine de var mı?


96

Android işlevi View.setPadding(int left, int top, int right, int bottom)yalnızca piksel cinsinden değerleri kabul eder, ancak dp'de dolguyu ayarlamak istiyorum. Etrafında herhangi bir yol var mı?

Yanıtlar:


187

Doğrudan kodlama

    int padding_in_dp = 6;  // 6 dps
    final float scale = getResources().getDisplayMetrics().density;
    int padding_in_px = (int) (padding_in_dp * scale + 0.5f);

1
Merhaba, bir sorum var. Bu formül yalnızca dolgu veya başka bir şey için mi kullanılıyor? örneğin bir dikdörtgenin kenar boşluğu veya boyutu?
emeraldhieu

4
Bu, dp birimlerini piksel birimlerine dönüştürmenin formülüdür . Her yerde kullanabilirsiniz
Labeeb Panampullan

2
getResources()Bir etkinlik tarafından miras alınan bir işlev olduğunu varsayıyorum , ancak bu satırları özel bir liste görünümü bağdaştırıcısında kullanmaya çalışıyorum. Arayamazsam bunu yapmamın bir yolu var mı getResources()?
Mike Baxter

1
Bağdaştırıcınızdan sadece getContext (). GetResources (). GetDisplayMetrics (). Yoğunluk;
Steve G.

4
"+ 0.5f" için bir yerde bir açıklama var mı?
Xavier L.

101

Boyutu (dp veya başka bir şekilde) bir XML dosyasında tanımlarsanız (bu, en azından çoğu durumda daha iyidir), bu kodu kullanarak bunun piksel değerini alabilirsiniz:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)

3

Değeri programlı olarak dp'ye dönüştürmenin daha iyi bir yolu var:

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

Ardından dpValueyönteminize uygulayın , örneğin:setPadding(dpValue,dpValue,dpValue,dpValue);



0

Ben de aynı problemim var. Bulduğum tek çözüm (size gerçekten yardımcı olmayacak :)) Xml dosyasında ayarlamaktır.

Yoğunluğu koddan alabiliyorsanız, dönüştürmeyi kullanabilirsiniz: "Daldırma birimlerinin ekran piksellerine dönüştürülmesi basittir: piksel = düşüş * (yoğunluk / 160)." ( http://developer.android.com/guide/practices/screens_support.html adresinden )

Düzenleme: Ekran yoğunluğunu alabilirsiniz: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi


0

İşte kabul edilen yanıta dayalı Kotlin sürümü:

fun dpToPx(dp: Int): Int {
    val scale = resources.displayMetrics.density
    return (dp * scale + 0.5f).toInt()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.