PhotoViewAttacher очищает границы изображения и масштабирования

Я использую PhotoView библиотеку для реализации масштабирования Android ImageView. Масштабирование работает отлично.

Я устанавливаю изображение с low-quality в ImageView, а затем загружаю новое изображение с помощью hight-quality, которое заменит образ low-quality.

Если пользователь увеличивает изображение low-quality - изображение high-quality заменяет существующее изображение, а уровень масштабирования очищается: (

Как сохранить уровень масштабирования после загрузки изображения high-quality?

Я попытался получить изображение Matrix из PhotoViewAttacher в low-quality и установить его в high-quality image, но он не работает - уровень и границы масштабирования изображения не совпадают с они были раньше. Изображение high-quality заменило образ low-quality в ImageView.

    Matrix matrix;
    imageView.setImageBitmap(imageBitmap);
    ...

    PhotoViewAttacher  mAttacher = new PhotoViewAttacher(imageView);
    // save the matrix before any modifications
    matrix = mAttacher.getDisplayMatrix(); 
    mAttacher.setOnMatrixChangeListener(new OnMatrixChangedListener() {
        @Override
        public void onMatrixChanged(RectF rect) {
            // update the matrix
            matrix = mAttacher.getDisplayMatrix(); 
        }
    });

    imageProvider.load(getActivity(), imageView, imageUrl, progressBarView, imageConfig, new ImageCallback() {
        @Override
        public void onSuccess(ImageView imageView) {
            // update image in ImageView
            // probably the problem is in this .update() call
            // but I don't get what the exact problem
            mAttacher.update();
            // restore high-quality image matrix
            mAttacher.setDisplayMatrix(matrix);
        }

        @Override
        public void onError(ImageView imageView) {

        }
    });

Изменить: Изображения имеют разные размеры.

Ответ 1

Посмотрев код PhotoViewAttacher.java - кажется, что вызов update() выполняет две вещи:

  • Убедитесь, что тип шкалы для ImageView установлен на ScaleType.MATRIX.
  • Отменить текущую матрицу и пересчитать ее в соответствии с размерами нового Drawable.

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