Как расширить представление при масштабировании изображения во ViewPager2

Я пытался с помощью ViewPager2 получить стандартную галерею стандартного Android-смартфона, где вы можете масштабировать изображение с помощью элементов управления панорамированием и сведением пальцев вместе с возможностью перехода к другой фотографии с помощью жестов смахивания.

Я столкнулся с проблемой, при которой, когда увеличенное изображение пролистывалось в ожидании панорамирования, вместо этого ViewPager2 переключался на другую страницу.

ViewPager2 реагирует на событие смахивания и вызывает изменение страницы и не позволяет масштабируемому виду реагировать на это событие.

Как решить проблему? Спасибо.


person Robert88    schedule 13.11.2020    source источник


Ответы (1)


Единственное решение, которое я нашел, - это использовать старый ViewPager, с помощью которого можно перехватывать события, и если фотография увеличена, можно отключить изменение страницы и разрешить управление масштабированием.

Сначала я определил поле в статическом классе, чтобы отслеживать состояние, в котором находится фотография:

public class Utilities {
....
    static boolean isZoomed;
    
    private Utilities () { }

    static public void setIsZoomed (boolean z) {
        isZoomed = z;
    }
    static public boolean getIsZoomed () {
        return isZoomed;
    }
....
}

Затем в пользовательском классе для управления масштабированием я определяю статус фотографии:

public class TouchImageView extends ImageView {
...
        Utilities.setIsZoomed(normalizedScale != 1);
...
}

Наконец, в пользовательском классе ViewPager я отключаю или разрешаю разбиение на страницы в зависимости от состояния фотографии:

public class CustomViewPager extends ViewPager {
    public CustomViewPager (Context context) {
        super(context);
    }
    public CustomViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onInterceptTouchEvent (MotionEvent ev) {
        try {
            if (Utilities.getIsZoomed())
                return false;
            else
                return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}
person Robert88    schedule 15.11.2020