Как сделать так, чтобы изображение метки визуально было одного размера на устройствах с разным разрешением экрана и ppi?

Рейтинг: -1Ответов: 1Опубликовано: 20.01.2023

Задаю иконку метки таким образом:

locationImage = ImageProvider.fromResource(MainActivity.this, R.drawable.location).getImage();
myPlacemark.setIcon(ImageProvider.fromBitmap(Bitmap.createScaledBitmap(locationImage, 70, 200, false)));

Тестирую на устройстве с экраном 2340×1080, около 400 ppi. Метки отображаются как нужно. Если же запускаю в эмуляторе на телефоне с экраном, у которого размер, разрешение и ppi поменьше, то метки там выглядят огромными.

Как это можно решить, может какую-то формулу использовать?

Ответы

▲ 0Принят

Решено на основе этой статьи.

Сначала рассчитано по формуле из статьи нужное значение в dp.

Дальше dp преобразую в px в зависимости от характеристик экрана (PLACEMARK_WIDTH_DP и PLACEMARK_HEIGHT_DP - константы, содержащие значение ширины и длины метки в dp):

placemarkWidthPx = (int) TypedValue.applyDimension(
            COMPLEX_UNIT_DIP,
            PLACEMARK_WIDTH_DP,
            getResources().getDisplayMetrics());

placemarkHeightPx = (int) TypedValue.applyDimension(
            COMPLEX_UNIT_DIP,
            PLACEMARK_HEIGHT_DP,
            getResources().getDisplayMetrics());

После этого размеры метки задаю, исходя из рассчитанных значений:

myPlacemark.setIcon(ImageProvider.fromBitmap(Bitmap.createScaledBitmap(locationImage, placemarkWidthPx, placemarkHeightPx, false)));