Apakah setWidth (int piksel) menggunakan dip atau px?

Jawaban:

222

Ini menggunakan piksel, tapi saya yakin Anda bertanya-tanya bagaimana cara menggunakan dips. Jawabannya ada TypedValue.applyDimension(). Berikut adalah contoh cara mengonversi dips ke px dalam kode:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Dan Lew
sumber
64
Anda juga dapat memanggil nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy
9
Faktanya, itulah yang dilakukan TypedValue.applyDimension (). Saya mempertimbangkan untuk memposting itu, tetapi saya suka melalui API jika ada yang berubah ... meskipun saya rasa aman untuk menggunakan metode itu jika Anda memberikannya oke. :)
Dan Lew
12
Versi applyDimension () mengeksekusi lebih banyak kode dan saya menemukan sedikit lebih sulit untuk dibaca. FWIW, baris yang saya posting adalah apa yang sebenarnya kami gunakan di semua tempat dalam kerangka kerja dan aplikasi standar.
Romain Guy
1
Hai, saya mencoba dua contoh di atas dan tampaknya tidak menghitung piksel dengan benar. sebagai gantinya, ini mengembalikan nilai persis seperti yang saya tentukan dalam tampilan saya: android: layout_width = "50dip" dalam kasus saya. itu akan mengembalikan saya 50 nilai yang tepat dalam file xml. saya kemudian memeriksanya di aplikasi dan seperti yang diharapkan, nilainya salah dan menggambar tampilan terlalu besar dari yang diharapkan
Jonathan
Satu-satunya solusi yang saya temukan untuk konversi px ke pt, sangat bagus.
A-Live
24

Cara yang benar untuk mendapatkan sejumlah DIP yang konstan dalam kode adalah dengan membuat file XML sumber daya yang berisi nilai dp seperti:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Kemudian rujuk ke sumber daya dalam kode Anda seperti:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

Float yang Anda kembalikan akan diskalakan sesuai dengan kepadatan piksel perangkat dan jadi Anda tidak perlu terus mereplikasi metode konversi di seluruh aplikasi Anda.

SDJMcHattie
sumber
Dalam situasi saya, solusi ini bekerja paling baik di mana saya memiliki dialog kustom yang memiliki tampilan daftar dan keinginan untuk mengatur lebar Label Header dan kolom di ListView dengan lebar yang sama.
Wayne Phipps
Kalimat pertama Anda agak lucu, pada dasarnya Anda mengatakan bahwa membuat file XML adalah cara yang tepat untuk "menentukan [sesuatu] dalam kode" . Saya pikir Anda hanya menggunakan konstanta dalam kode yang tidak menentukannya :)
Joffrey
@Joffrey ya saya mengerti maksud Anda jadi saya telah memperbarui kata-katanya sedikit
SDJMcHattie
7

Metode setWidth (100), atur 100 px sebagai lebar (bukan dalam dp). Jadi Anda mungkin menghadapi masalah lebar yang bervariasi pada ponsel Android yang berbeda.Jadi gunakan pengukuran dalam dp, bukan piksel. Gunakan kode di bawah ini untuk mendapatkan pengukuran dalam dp dari lebar sampel = 300px dan tinggi = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
Nidhin
sumber
4
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Sumber (@Romain Guy)

pomber
sumber
0

Piksel tentu saja, metode ini meminta piksel sebagai parameter.

Josnidhin
sumber
1
Jika ada dalam file layout xml, kita dapat menentukan android: layout_width = "100dip" atau android: layout_width = "100px". Di kode sumber, kita tidak bisa menentukan lebar layout sebagai 100dip?
pengguna256239
Tidak secara langsung, Anda harus mengubah diri Anda sendiri menggunakan DisplayMetrics.density.
Romain Guy
0

Berdasarkan jawaban di atas yang berfungsi dengan baik bagi saya, saya menghasilkan beberapa metode pembantu , cukup tambahkan di utilitas Anda untuk menggunakannya di seluruh proyek.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
Abhishek Garg
sumber