Как определить ширину экрана с точки зрения dp или dip во время выполнения в Android?
Мне нужно кодировать макет виджетов 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.
13 ответов
Попробуй это
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;
ИЛИ ЖЕ
Спасибо @ Томаш Хубалек
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
Я наткнулся на этот вопрос от 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.
См. Ссылку на класс конфигурации
Редактировать: Как отметил Ник Baicoianu, это возвращает полезную ширину / высоту экрана (которая должна быть интересной в большинстве случаев). Если вам нужны фактические размеры дисплея, придерживайтесь ответа сверху.
Упрощено для Котлина:
val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
Как насчет использования этого вместо?
final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
Вам не хватает значения плотности по умолчанию 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
Другими словами, если вы создадите макет с шириной, равной 160dip, в портретном режиме, он будет составлять половину экрана на всех устройствах ldpi/mdpi/hdpi (за исключением планшетов, я думаю)
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;
Ответ на котлине:
context?.let {
val displayMetrics = it.resources.displayMetrics
val dpHeight = displayMetrics.heightPixels / displayMetrics.density
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
}
Получите ширину и высоту экрана с точки зрения 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();
В новом мире Compose на одной строке
val (height, width) = LocalConfiguration.current.run { screenHeightDp.dp to screenWidthDp.dp }
Это функция копирования / вставки, которая будет использоваться на основе предыдущих ответов.
/**
* @param context
* @return the Screen height in DP
*/
public static float getHeightDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
return dpHeight;
}
/**
* @param context
* @return the screnn width in dp
*/
public static float getWidthDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
return dpWidth;
}
Если вы просто хотите узнать ширину вашего экрана, вы можете просто найти "наименьшую ширину экрана" в опциях разработчика. Вы даже можете редактировать это.
Попробуй это:
Display display = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width = displaySize.x;
int height = displaySize.y;
Ваша проблема с приведением числа с плавающей точкой к int с потерей точности. Вы должны также умножить с фактором и не делить.
Сделай это:
int dp = (int)(pixel*getResources().getDisplayMetrics().density);