Как определить ширину экрана с точки зрения dp или dip во время выполнения в Android? - PullRequest
178 голосов
/ 24 июня 2011

Мне нужно кодировать компоновку виджетов Android с помощью dip / dp (в java-файлах).Во время выполнения, если я кодирую,

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

, это возвращает ширину экрана в пикселях (px).Чтобы преобразовать это в дп, я закодировал:

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

Это, кажется, не возвращает правильный ответ.Я сделал эмулятор WVGA800 с разрешением экрана 480 на 800. Когда запустил эмулятор и позволил коду напечатать значения pixel и dp, он достиг 320 в обоих.Этот эмулятор имеет 240 точек на дюйм, масштабный коэффициент которого будет 0,75.

Ответы [ 8 ]

349 голосов
/ 01 августа 2012

Попробуйте это

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;

OR

Спасибо @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
99 голосов
/ 28 мая 2014

Я наткнулся на этот вопрос от Google, а позже я нашел простое решение, действительное для API> = 13.

Для будущих ссылок:

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.

См. Ссылка на класс конфигурации

Edit: Как отметил Ник Baicoianu, это возвращает пригодную для использования ширину / высоту экрана (что должно быть интересным в большинстве случаев) Если вам нужны фактические размеры дисплея, придерживайтесь верхнего ответа.

7 голосов
/ 24 июня 2011

Вам не хватает значения плотности по умолчанию, равного 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

Другими словами, если вы создадите макет с шириной, равной 160 dip, в портретном режиме, это будет половина экрана на всех ldpi /устройства mdpi / hdpi (кроме планшетов, я думаю)

6 голосов
/ 22 июля 2017
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;
6 голосов
/ 28 января 2014

Как насчет использования этого вместо?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
1 голос
/ 30 апреля 2019

Если вы просто хотите узнать о ширине экрана, вы можете просто найти «наименьшую ширину экрана» в опциях разработчика.Вы даже можете отредактировать его.

1 голос
/ 10 января 2019

Получите ширину и высоту экрана с точки зрения DP с хорошим оформлением:

Шаг 1: Создание интерфейса

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

Шаг 2: Создание класса реализатора

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);
    }
} 

Шаг 3: Получить ширину и высоту в активности:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();
0 голосов
/ 13 октября 2011

Ваша проблема с приведением числа с плавающей точкой к int, теряющим точность.Вы также должны умножить на коэффициент и не делить.

Сделайте это:

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