Saya telah membuat aplikasi saya dengan tinggi dan lebar yang diberikan dalam piksel untuk perangkat Pantech yang resolusinya 480x800
.
Saya perlu mengonversi tinggi dan lebar untuk perangkat G1.
Saya pikir mengubahnya menjadi dp akan menyelesaikan masalah dan memberikan solusi yang sama untuk kedua perangkat.
Apakah ada cara mudah untuk mengonversi piksel ke dp?
Ada saran?
android
pixel
resolution
dpi
Indhu
sumber
sumber
px
,dp
,sp
Rumus konversiJawaban:
sumber
applyDimension
? Bisakah saya lakukangetResource().getDisplayMetrics()
, atau ada sesuatu yang lain?Context
penggunaan objekResources.getSystem().getDisplayMetrics()
sumber
Resource.getSystem()
(penekanan ranjau): "Kembalikan objek Sumber Daya global bersama yang menyediakan akses ke hanya sumber daya sistem (tanpa sumber daya aplikasi), dan tidak dikonfigurasikan untuk layar saat ini ( tidak dapat menggunakan unit dimensi , tidak berubah berdasarkan orientasi, dll). "DisplayMetrics.DENSITY_DEFAULT
bukannya160f
developer.android.com/reference/android/util/…Lebih disukai dimasukkan ke dalam kelas Util.java
sumber
density
sama dengan.75
padaldpi
(120
dpi)1.0
padamdpi
(160
dpi; garis dasar)1.5
padahdpi
(240
dpi)2.0
padaxhdpi
(320
dpi)3.0
padaxxhdpi
(480
dpi)4.0
padaxxxhdpi
(640
dpi)Gunakan konverter online ini untuk bermain-main dengan nilai dpi.
EDIT: Tampaknya tidak ada hubungan 1: 1 antara
dpi
bucket dandensity
. SepertinyaNexus 5X
makhlukxxhdpi
memilikidensity
nilai2.625
(bukan3
). Lihat sendiri di Metrik Perangkat .sumber
Anda dapat menggunakan ini .. tanpa Konteks
Seperti @Stan disebutkan .. menggunakan pendekatan ini dapat menyebabkan masalah jika sistem mengubah kepadatan. Jadi sadarilah itu!
Secara pribadi saya menggunakan Konteks untuk melakukan itu. Ini hanya pendekatan lain yang ingin saya bagikan kepada Anda
sumber
Jika Anda dapat menggunakan dimensi XML, itu sangat sederhana!
Di Anda
res/values/dimens.xml
:Kemudian di Jawa Anda:
sumber
Menurut Panduan Pengembangan Android:
Tetapi seringkali Anda ingin melakukan ini dengan cara sebaliknya ketika Anda menerima desain yang dinyatakan dalam piksel. Begitu:
Jika Anda menggunakan perangkat 240dpi, rasio ini adalah 1,5 (seperti yang dinyatakan sebelumnya), jadi ini berarti bahwa ikon 60px sama dengan 40dp dalam aplikasi.
sumber
Tanpa
Context
, metode statis yang elegan:sumber
Resources.getSystem()
javadoc mengatakan "Kembalikan objek Sumber Daya bersama global yang menyediakan akses ke hanya sumber daya sistem (tanpa sumber daya aplikasi), dan tidak dikonfigurasikan untuk layar saat ini (tidak dapat menggunakan unit dimensi, tidak berubah berdasarkan orientasi, dll)." Ini cukup banyak mengatakan Anda tidak harus melakukan ini bahkan jika itu entah bagaimana berhasil.Untuk
DP to Pixel
Buat nilai dalam
dimens.xml
Dapatkan nilai itu
pixel
sebagai:sumber
Karena itu Anda dapat menggunakan formulator berikut untuk menghitung jumlah piksel yang tepat dari dimensi yang ditentukan dalam dp
sumber
convertToDp
.Untuk siapa saja yang menggunakan Kotlin:
Pemakaian:
sumber
Ada util default di SDK android: http://developer.android.com/reference/android/util/TypedValue.html
sumber
resultPix
harus bertipe int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
menggunakan kotlin-extension membuatnya lebih baik
MEMPERBARUI:
Karena
displayMetrics
merupakan bagian dari Sumber Daya bersama global , kita dapat menggunakanResources.getSystem()
sumber
Ini akan memberi Anda konversi dp ke piksel:
Ini akan memberi Anda piksel konversi ke dp:
sumber
Kotlin
Jawa
sumber
Mungkin cara terbaik jika Anda memiliki dimensi di dalam nilai / dimen adalah untuk mendapatkan dimensi langsung dari metode getDimension (), itu akan mengembalikan Anda dimensi yang sudah dikonversi menjadi nilai piksel.
Untuk lebih menjelaskan hal ini,
akan mengembalikan dimensi yang sudah dikonversi ke piksel AS A FLOAT.
akan mengembalikan yang sama tetapi terpotong ke int, jadi AS AN INTEGER.
Lihat referensi Android
sumber
di mana sumber daya adalah context.getResources ().
sumber
seperti ini:
tergantung pada Konteks, mengembalikan nilai float, metode statis
dari: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
sumber
Pendekatan yang lebih elegan menggunakan fungsi ekstensi kotlin
Pemakaian:
sumber
function name
" yang saya sadari mundur dalam kasus ini. Untuk memperjelas maksud masing-masing fungsi, nama fungsi dapat diperbarui untuk masing-masing membaca dpToPx dan pxToDp.sumber
Jika Anda mengembangkan aplikasi penting kinerja, harap pertimbangkan kelas yang dioptimalkan berikut:
sumber
untuk mengonversi Pixel ke dp gunakan TypedValue .
Seperti yang disebutkan dalam dokumentasi: Wadah untuk nilai data yang diketik secara dinamis.
dan gunakan metode applyDimension :
yang Mengonversi nilai data kompleks yang tidak dibungkus yang menahan dimensi ke nilai titik apung terakhirnya seperti berikut:
Semoga Itu Membantu.
sumber
Ini cara kerjanya untuk saya:
Anda dapat melakukan hal yang sama untuk lebar.
sumber
Banyak solusi hebat di atas. Namun, solusi terbaik yang saya temukan adalah desain google:
https://design.google.com/devices/
sumber
Anda harus menggunakan dp seperti halnya piksel. Itu saja mereka; menampilkan piksel independen. Gunakan angka yang sama seperti pada layar kepadatan menengah, dan ukurannya akan benar secara ajaib pada layar kepadatan tinggi.
Namun, sepertinya yang Anda butuhkan adalah opsi fill_parent dalam desain tata letak Anda. Gunakan fill_parent ketika Anda ingin tampilan atau kontrol Anda diperluas ke semua ukuran yang tersisa di wadah induk.
sumber
PX
danDP
berbeda tetapi serupa.DP
adalah resolusi ketika Anda hanya memperhitungkan ukuran fisik layar. Ketika Anda menggunakannyaDP
akan mengatur tata letak Anda ke layar berukuran serupa lainnya denganpixel
kepadatan berbeda .Kadang-kadang Anda benar-benar ingin
pixels
, dan ketika Anda berurusan dengan dimensi dalam kode Anda selalu berurusan dengan nyatapixels
, kecuali jika Anda mengubahnya.Jadi pada perangkat android,
hdpi
layar berukuran normal ,800x480 is 533x320
diDP
(saya percaya). Untuk mengkonversiDP
menjadipixels /1.5
, untuk mengkonversi kembali*1.5
. Ini hanya untuk satu ukuran layar dandpi
, itu akan berubah tergantung pada desain. Artis kami memberi sayapixels
dan saya beralih keDP
dengan1.5
persamaan di atas .sumber
Jika Anda ingin nilai Integer maka menggunakan Math.round () akan mengitari float ke integer terdekat.
sumber
Jawaban terbaik datang dari kerangka kerja Android itu sendiri: cukup gunakan persamaan ini ...
(mengkonversi dp ke px)
sumber
Workds ini untuk saya (C #):
sumber
kotlin
Jawa
sumber