Размеры иконок для Android приложений

Для того, чтобы согласовать интерфейсы приложений на целом зоопарке устройств, было придумано разбить их по плотности экранов (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+ размеры получаются по-другому.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *