View.setPadding hanya menerima dalam px, apakah tetap ada untuk setPadding di dp?

93

Fungsi Android View.setPadding(int left, int top, int right, int bottom)hanya menerima nilai dalam px tetapi saya ingin mengatur padding dalam dp. Apakah ada jalan lain?

Sharj
sumber

Jawaban:

184

Langsung ke kode

    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
sumber
1
Hai, saya punya pertanyaan. Apakah formula ini hanya digunakan untuk padding atau yang lainnya? misalnya margin atau dimensi dimensi persegi panjang?
emeraldhieu
4
Ini adalah rumus untuk Mengonversi satuan dp menjadi satuan piksel . Anda dapat menggunakannya di mana saja
Labeeb Panampullan
2
Saya berasumsi getResources()adalah fungsi yang diwarisi oleh aktivitas, tetapi saya mencoba menggunakan baris ini dalam adaptor listview kustom. Adakah cara agar saya dapat melakukan ini jika saya tidak dapat menelepon getResources()?
Mike Baxter
1
Dari adaptor Anda cukup lakukan getContext (). GetResources (). GetDisplayMetrics (). Density;
Steve G.
4
Apakah ada penjelasan di suatu tempat untuk "+ 0.5f"?
Xavier L.
97

Jika Anda menentukan dimensi (dalam dp atau apa pun) dalam file XML (yang lebih baik, setidaknya dalam banyak kasus), Anda bisa mendapatkan nilai pikselnya menggunakan kode ini:

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

Ada cara yang lebih baik untuk mengonversi nilai menjadi dp secara terprogram:

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

Kemudian terapkan dpValueke metode Anda, misalnya:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
sumber
0

Saya memiliki masalah yang sama. Satu-satunya solusi yang saya temukan (ini tidak akan benar-benar membantu Anda :)) adalah dengan mengaturnya di file Xml.

Jika Anda bisa mendapatkan kepadatan dari kode, Anda dapat menggunakan konversi: "Konversi unit dip menjadi piksel layar sederhana: piksel = dips * (kepadatan / 160)." (dari http://developer.android.com/guide/practices/screens_support.html )

Edit: Anda bisa mendapatkan kerapatan layar: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
sumber