Android - изображение имеет разные размеры на разных телефонах

У меня есть приложение, которое работает с Facebook SDK и API Google Map.

На HomeActivityЯ получаю изображение профиля пользователя и рисую его на карте Google в качестве маркера.

public void loadProfilePicture(String picUrl, final Location location) {
    Picasso.with(getActivity()).load(picUrl).into(new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            drawCanvas(location, bitmap);
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }
    });
}

private void drawCanvas(Location location, Bitmap bitmap) {
    photoMarker = getMap().addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude()))
            .icon(BitmapDescriptorFactory.fromBitmap(bitmap))
            .anchor(0.5f, 1));
}

Моя проблема - когда я запускаю приложение на разных устройствах (например,OnePlusOne и samsung gt-18190), оно рисует изображение больше на устройстве samsung gt-18190 (что странно, меньше).

Я проверил picUrl в loadProfilePicture метод, и они оба выглядят одинакового размера на хром, но на разных устройствах, разные размеры.

Что я делаю неправильно?

1 ответ

Решение

Samsung имеет половину плотности пикселей OnePlusOne (~233ppi против ~401ppi), поэтому если растровое изображение, загружаемое на оба телефона, имеет одинаковое разрешение, оно будет больше на Samsung.

Что вы можете сделать, это взять растровое изображение, возвращенное из Picasso, и создать масштабированную версию с помощью функции Bitmap.createScaledBitmap и файла ресурсов с некоторыми независимыми от плотности измерениями. Например:

В вашем ресурсе измерение.xml. (Используйте любые значения dp, подходящие для вашего приложения)

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="profile_width">200dp</dimen>
        <dimen name="profile_height">200dp</dimen>
    </resources>

В вашей домашней деятельности.

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        int width = (int) getResources().getDimension(R.dimen.profile_width);
        int height = (int) getResources().getDimension(R.dimen.profile_height);
        drawCanvas(location, Bitmap.createScaledBitmap(bitmap, width, height, false));
    }
Другие вопросы по тегам