Bagaimana cara menentukan lebar layar dalam hal dp atau dip saat runtime di Android?

192

Saya perlu kode tata letak widget android menggunakan dip / dp (dalam file java). Saat runtime jika saya kode

int pixel=this.getWindowManager().getDefaultDisplay().getWidth(),;

ini mengembalikan lebar layar dalam piksel (px). Untuk mengonversi ini menjadi dp, saya memberi kode:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

Tampaknya ini tidak mengembalikan jawaban yang benar. Saya membuat emulator WVGA800 yang resolusi layarnya 480 kali 800. Ketika menjalankan emulator dan membiarkan kode mencetak nilai-nilai pixel dan dp, itu datang ke 320 di keduanya. Emulator ini adalah 240 dpi yang faktor skalanya adalah 0,75.

Khushboo
sumber

Jawaban:

376

Coba ini

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

ATAU

Terima kasih @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
Dax
sumber
90
Mengapa perlu memanggil WindowManager? Bagaimana dengan kode ini? DisplayMetrics displayMetrics = resources.getDisplayMetrics (); float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
Tomáš Hubálek
2
Ini tidak berhasil bagi saya menggunakan layar kepadatan sangat tinggi. Seolah-olah itu hanya mendapat sebagian kecil dari layar. Solusi ini bekerja untuk saya: stackoverflow.com/a/18712361/956975 Tampilan layar = getWindowManager (). GetDefaultDisplay (); Ukuran titik = Titik baru (); display.getSize (ukuran); int width = size.x; int height = size.y;
marienke
1
@dsdsdsdsd: konteks adalah setiap instance dari kelas Konteks. Terutama, Aktivitas adalah subkelas Konteks (jadi gunakan ini dalam Aktivitas, dan getActivity () dalam Fragmen). Aplikasi dan Layanan juga merupakan subkelas Konteks.
François POYER
112

Saya menemukan pertanyaan ini dari Google, dan kemudian saya menemukan solusi mudah yang valid untuk API> = 13.

Untuk referensi di masa mendatang:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

Lihat referensi kelas konfigurasi

Edit: Sebagaimana dicatat oleh Nick Baicoianu, pengembalian ini dapat digunakan lebar / tinggi layar (yang seharusnya menjadi orang-orang yang menarik di sebagian besar menggunakan). Jika Anda membutuhkan dimensi tampilan aktual, pertahankan jawaban yang paling atas.

serjlee
sumber
23
Satu perbedaan penting antara menggunakan layar KonfigurasiWidthDp / screenHeightDp vs DisplayMetrics widthPixels / heightPixels adalah Konfigurasi mengembalikan dimensi tampilan yang dapat digunakan (minus bilah status dll), sementara DisplayMetrics mengembalikan dimensi layar penuh.
Nick Baicoianu
Ini hanya untuk API Tingkat 13 dan up
ono
Untuk menambahkan komentar @ NickBaicoianu, metode getConfiguration () dan getDisplayMetrics () berfungsi dalam mode multi-jendela. yaitu ukuran mencerminkan ukuran jendela, bukan layar.
nmw
7

Anda kehilangan nilai kepadatan standar 160.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

Dengan kata lain, jika Anda mendesain tata letak Anda dengan lebar sama dengan 160dip dalam mode potret, itu akan menjadi setengah layar di semua perangkat ldpi / mdpi / hdpi (kecuali tablet, saya pikir)

Mykhailo Gaidai
sumber
Apa yang Anda jawab adalah alasan logis di balik pertanyaan saya. Saya mengerti ini. Bagaimana saya harus kode ini di java sehingga pada saat runtime apa pun resolusi layar, lebar dpi yang benar diambil oleh kode?
Khushboo
Semoga saya bisa melakukannya dengan benar kali ini :) Gunakan di DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);dalam Activity. Kemudian, outMetrics.densityakan memberi Anda faktor skala perangkat saat ini, sebagaimana dinyatakan dalam dokumen
Mykhailo Gaidai
6

Bagaimana kalau menggunakan ini?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
pengembang android
sumber
6
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;
Supun Madushanka
sumber
8
Pertimbangkan untuk memberikan penjelasan
bigbounty
5

Jawab di kotlin:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }
Bolling
sumber
4

Disederhanakan untuk Kotlin:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
TheYogi
sumber
2

Dapatkan Lebar Layar dan Tinggi dalam hal DP dengan beberapa hiasan bagus:

Langkah 1: Buat antarmuka

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

Langkah 2: Buat kelas implementer

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

Langkah 3: Dapatkan lebar dan tinggi dalam aktivitas:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();
Ali Azaz Alam
sumber
Apakah ini mengembalikan tinggi dan lebar dalam piksel atau dp?
Taslim Oseni
seperti yang disebut .density itu sebabnya itu memberi Anda dalam dp
Ali Azaz Alam
Saya tidak berpikir itu ide yang baik untuk menambahkan nada kode ke aplikasi Anda untuk menyelesaikan tugas sederhana
Ruslan Berozov
Pak terserah Anda apakah akan mengimplementasikan kelas atau langsung kode itu. Dari kelas yang ditentukan Anda dapat dengan mudah mengekstrak kode untuk implementasi langsung.
Ali Azaz Alam
0

Jika Anda hanya ingin tahu tentang lebar layar Anda, Anda bisa mencari "lebar layar terkecil" di opsi pengembang Anda. Anda bahkan dapat mengeditnya.

saluran matematika
sumber
0

Coba ini:

Display display   = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width  = displaySize.x;
int height = displaySize.y;
Muhammed naseef Koppilakkal
sumber
-5

Masalah Anda adalah dengan melempar float ke int, kehilangan presisi. Anda juga harus memperbanyak dengan faktor dan tidak membagi.

Melakukan hal ini:

int dp = (int)(pixel*getResources().getDisplayMetrics().density);
Dirk le Roux
sumber
3
Jawaban ini salah. Dari developer.android.com/guide/practices/… , Pixel = Dp * Density.
Vance-Turner