Saya mencoba menghitung jumlah variabel piksel ke piksel independen dan sebaliknya.
Formula (px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));
ini tidak berfungsi pada perangkat kecil karena dibagi dengan nol.
Ini adalah formula dp to px saya:
px = (int)(dp * (displayMetrics.densityDpi / 160));
Bisakah seseorang memberi saya beberapa petunjuk?
Jawaban:
Catatan: Solusi yang banyak digunakan di atas didasarkan pada
displayMetrics.density
. Namun, dokumen menjelaskan bahwa nilai ini adalah nilai bulat, digunakan dengan layar 'ember'. Misalnya. pada Nexus 10 saya mengembalikan 2, di mana nilai sebenarnya adalah 298dpi (real) / 160dpi (default) = 1.8625.Tergantung pada kebutuhan Anda, Anda mungkin memerlukan transformasi yang tepat, yang dapat dicapai seperti ini:
[Sunting] Ini tidak dimaksudkan untuk dicampur dengan unit dp internal Android, karena hal ini tentu saja masih berdasarkan pada ember layar. Gunakan ini di mana Anda menginginkan unit yang harus merender ukuran sebenarnya yang sama pada perangkat yang berbeda.
Konversi dp ke piksel:
Konversikan piksel ke dp:
Perhatikan bahwa ada properti xdpi dan ydpi, Anda mungkin ingin membedakan, tapi saya tidak bisa membayangkan tampilan waras di mana nilai-nilai ini sangat berbeda.
sumber
Saya memecahkan masalah saya dengan menggunakan rumus berikut. Semoga orang lain mendapat manfaat darinya.
dp ke px:
px ke dp:
sumber
px ke dp:
sumber
typedValue.applyDimension( TypedValue.COMPLEX_UNIT_PX, valueInDp , getResources() .getDisplayMetrics());
dari PX ke DP, juga ini adalah jawaban terbaikapplyDimension
hanya menghasilkan piksel. Lihat android.googlesource.com/platform/frameworks/base/+/refs/heads/… di mana konversi tidak dilakukanCOMPLEX_UNIT_PX
.dp
. Jika Anda melihat kode sumber, untuk kasus iniTypedValue.COMPLEX_UNIT_DIP
,value * metrics.density
dikembalikan, di mana Anda benar-benar perluvalue * metrics.density
. Jadi, apa yang Anda peroleh `valueInDp` BUKANdp
untukvalueInPx
masukpx
.value / metrics.density
"Cara yang efisien
DP ke Pixel:
Piksel ke DP:
Semoga ini bisa membantu Anda.
sumber
displayMetrics.xdpi
yang berbeda pada perangkat apa pun. Sayangnya, jawaban yang salah ini juga paling banyak mendapat dukungan.private fun dpToPx(dp: Int) = (dp * Resources.getSystem().displayMetrics.density).toInt()
Panggil saja
getResources().getDimensionPixelSize(R.dimen.your_dimension)
untuk mengonversi daridp
satuan ke pikselsumber
Gunakan fungsi ini
sumber
sumber
(displayMetrics.densityDpi / 160)
- bagian ini bisa mendapatkan 0 pada perangkat kecil, di sana ia menghitung misalnya120/160
, kedua nilai int, yang menghasilkan 0. Yang berakhir sebagai(int) (px/0)
.Dalam sebagian besar kasus, fungsi konversi sering dipanggil. Kami dapat mengoptimalkannya dengan menambahkan memoisasi. Jadi, itu tidak menghitung setiap kali fungsi dipanggil.
Mari mendeklarasikan HashMap yang akan menyimpan nilai yang dihitung.
Fungsi yang menghitung nilai piksel:
Fungsi memoisasi yang mengembalikan nilai dari HashMap dan memelihara catatan nilai sebelumnya.
Memoisasi dapat diimplementasikan dengan berbagai cara di Jawa. Untuk Java 7 :
Java 8 mendukung fungsi Lambda :
Terima kasih.
sumber
coba ini http://labs.skinkers.com/content/android_dp_px_calculator/
sumber
Fungsi di bawah berfungsi dengan baik untuk saya di seluruh perangkat.
Ini diambil dari https://gist.github.com/laaptu/7867851
sumber
Anda dapat menggunakan
[DisplayMatrics][1]
dan menentukan kepadatan layar. Sesuatu seperti ini:Seingat saya lebih baik menggunakan lantai untuk offset dan pembulatan untuk lebar.
sumber
Jika Anda mencari kalkulator daring untuk mengonversi DP, SP, inci, milimeter, titik atau piksel ke dan dari satu sama lain pada kepadatan layar yang berbeda, ini adalah alat paling lengkap yang saya tahu .
sumber
// untuk mendapatkan dalam bentuk Desimal / Float
________________________________________________________________________________
sumber
Gunakan ekstensi Kotlin ini:
sumber
Jangan ragu untuk menggunakan metode ini yang saya tulis:
sumber
Jawaban yang diterima di atas tidak sepenuhnya akurat. Menurut informasi yang diperoleh dengan memeriksa kode sumber Android:
Resources.getDimension()
dangetDimensionPixelOffset()
/getDimensionPixelSize()
hanya berbeda dalam hal pengembalian yang pertamafloat
sedangkan yang kedua mengembalikan nilai yang sama dibulatkan menjadiint
tepat. Untuk semuanya, nilai kembaliannya dalam piksel mentah.Ketiga fungsi diimplementasikan dengan memanggil
Resources.getValue()
dan mengkonversi sehingga diperolehTypedValue
dengan memanggilTypedValue.complexToDimension()
,TypedValue.complexToDimensionPixelOffset()
danTypedValue.complexToDimensionPixelSize()
, masing-masing.Oleh karena itu, jika Anda ingin mendapatkan nilai "mentah" bersama dengan unit yang ditentukan dalam sumber XML, panggil
Resources.getValue()
dan gunakan metodeTypedValue
kelas.sumber
dengan bantuan jawaban lain saya menulis fungsi ini.
sumber
Berikut cara lain untuk melakukannya menggunakan ekstensi kotlin:
dan kemudian dapat digunakan seperti ini dari mana saja
sumber
sumber
variasi jawaban ct_robs di atas, jika Anda menggunakan bilangan bulat, yang tidak hanya menghindari bagi dengan 0, juga menghasilkan hasil yang dapat digunakan pada perangkat kecil:
dalam perhitungan bilangan bulat yang melibatkan pembagian untuk penggandaan presisi terbesar terlebih dahulu sebelum membaginya untuk mengurangi efek pemotongan.
dari pada
jika Anda ingin hasil bulat lakukan ini
sumber