Сенсорный зум под видоискателем / FrameLayout


У меня был pinch-to-zoom, работающий довольно хорошо для нескольких версий приложений, теперь использующих TouchImageView Майка Ортиса и пользовательский TouchViewPager, так что он может работать внутри пейджера просмотра. Это работало довольно хорошо - единственный метод, который переопределяет TouchViewPager, это onInterceptTouchEvent :

public boolean onInterceptTouchEvent(MotionEvent ev) {
    TouchImageView view = getTouchView();
    if( null != view ){
        if( !view.isAtLimit() && view.getCurrentScale() > 1){
            return false;
        } else {
            Log.v(TAG, "View limit = " + view.isAtLimit());
            Log.v(TAG, "View scale = " + view.getCurrentScale());
        }
    }

    return super.onInterceptTouchEvent(ev);
}
Недавно мы создали новое представление, которое расширяетFrameLayout и управляет загрузкой растрового изображения из интернета. В то время как растровое изображение загрузки в прогресс, этот макет показывает панель прогресса, а затем добавляет TouchImageView, как только он будет готов. Визуально это, кажется, работает - мы видим ProgressBar, а затем TouchImageView загружается - но прикосновения все перепутались и, как правило, просто не работают последовательно.

Я попытался делегировать onTouchEvent из представления изображения прогресса в представление изображения касания - не повезло. Я также попытался переопределить onInterceptTouchEvent в представлении изображения прогресса, чтобы всегда возвращать false, и это тоже не сработало.

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

Вот поведение, которое я вижу:

  1. Активность загружается, изображение видно внутри ViewPager - > FrameLayout - > TouchImageView.

  2. ViewPager работает, чтобы провести и изменить изображения, но pinch zoom не делает работайте над первыми или вторыми изображениями. В конце концов вы попадаете в положение этот Пинч-зум будет работать на. Я не могу понять, что изменилось.

  3. Если вы попытаетесь уменьшить масштаб перед пролистыванием, то видоискатель не будет работать, и это займет несколько пойло, чтобы получить ViewPager на страницу.

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

1 3

1 ответ:

Я смог заставить это работать, как ни странно, реализовав метод reset внутри класса TouchImageView:

public void resetZoom() {
    Matrix imageMatrix = getImageMatrix();
    RectF drawableRect = new RectF(0, 0, bmWidth, bmHeight);
    RectF viewRect = new RectF(0, 0, getWidth(), getHeight());

    imageMatrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);

    matrix = imageMatrix;
    setImageMatrix(matrix);

    fitAndCenterView();

    invalidate();
}

Этот метод сбрасывает масштаб изображения при вызове - и когда мы настраиваем изображение внутри framelayout вызова этого получает все настроено. Как ни странно, это не требуется, когда изображение не находится внутри Фреймлайаута.

Я бы, конечно, оценил любую очистку кода и все, что мы можем сделать.