Для того, чтобы согласовать интерфейсы приложений на целом зоопарке устройств, было придумано разбить их по плотности экранов (density).
Ну а точнее – все картинки можно подобрать под конкретную плотность экрана.
Для этого в проекте сразу создаются папки:
- drawable-hdpi
- drawable-ldpi
- drawable-mdpi
- drawable-xhdpi
- drawable-xxhdpi
В них нужно положить адаптированные изображения.
Сайт гугла дает ценные рекомендации по расчету их размеров.
В своих проектах я часто пользуюсь только разными размерами иконки для запуска (их рекомендуют именовать с префиксом ic_launcher).
То есть вам нужно сделать файлы с одним названием, различные только разрешением, и расположенными по соответствующим папкам.
Вот размеры в пикселях для каждой плотности экрана:
- LDPI 36×36.
- MDPI 48×48.
- TVDPI 64×64.
- HDPI 72×72.
- XHDPI 96×96.
- XXHDPI 144×144.
- XXXHDPI 192×192.
Когда плотность экрана не критична, я создаю папку простую папку drawable и храню все картинки в ней.
Если же плотность экрана критична, то можно высчитать размеры изображения, исходя из соотношения размера базовой картинки к соответствующему коэффициенту экрана.
За базовую плотность берется MDPI (48×48) .
- LDPI – MDPIx0.75.
- HDPI – MDPIx1.5.
- TVDPI – MDPIx1.33.
- XHDPI – MDPIx2.
- XXHDPI – MDPIx3.
- XXXHDPI – MDPIx4.
Во время публикации в маркете (play.google.com), понадобится ещё и иконка 512×512 и картинка для рекламы 1024×500.
Иногда требуется узнать плотность экрана на конечном устройстве пользователя.
Для этого создан класс DisplayMetrics .
Вот код примера получения плотности через getResources().getDisplayMetrics().densityDpi:
int density = getResources().getDisplayMetrics().densityDpi;
switch (density) {
case DisplayMetrics.DENSITY_LOW:
Toast.makeText(this, "LDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_MEDIUM:
Toast.makeText(this, "MDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_HIGH:
Toast.makeText(this, "HDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_TV:
Toast.makeText(this, "TVDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_XHIGH:
Toast.makeText(this, "XHDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_XXHIGH:
Toast.makeText(this, "XXHDPI", Toast.LENGTH_LONG).show();
break;
case DisplayMetrics.DENSITY_XXXHIGH:
Toast.makeText(this, "XXXHDPI", Toast.LENGTH_LONG).show();
break;
}
Если поставить этот код при создании активности (т.е. в методе OnCreate), мы получим сообщение с плотностью экрана текущего устройства.
А вот таким способом можно получить размер экрана устройства с помощью класса Configuration:
int screenSize = getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenSize) {
case Configuration.SCREENLAYOUT_SIZE_LARGE:
Toast.makeText(this, "Большой экран", Toast.LENGTH_LONG).show();
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
Toast.makeText(this, "Средний экран", Toast.LENGTH_LONG).show();
break;
case Configuration.SCREENLAYOUT_SIZE_SMALL:
Toast.makeText(this, "Маленький экран", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(this,
"Размер экрана не большой, не средний и не маленький",
Toast.LENGTH_LONG).show();
}
Ширину и высоту дисплея можно получить так:
int Measuredwidth = 0;
int Measuredheight = 0;
Point size = new Point();
WindowManager w = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
w.getDefaultDisplay().getSize(size);
Measuredwidth = size.x;
Measuredheight = size.y;
} else {
Display d = w.getDefaultDisplay();
Measuredwidth = d.getWidth();
Measuredheight = d.getHeight();
}
Обратите внимание на проверку версии апи на устройстве, для версии 13+ размеры получаются по-другому.