Сенсорный зум под видоискателем / 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, и это тоже не сработало.
Может ли кто - нибудь помочь с некоторыми идеями о том, где продолжить отладку этой проблемы? Я работаю над этим уже около недели, но без особого успеха.
Вот поведение, которое я вижу:
-
Активность загружается, изображение видно внутри ViewPager - > FrameLayout - > TouchImageView.
-
ViewPager работает, чтобы провести и изменить изображения, но pinch zoom не делает работайте над первыми или вторыми изображениями. В конце концов вы попадаете в положение этот Пинч-зум будет работать на. Я не могу понять, что изменилось.
-
Если вы попытаетесь уменьшить масштаб перед пролистыванием, то видоискатель не будет работать, и это займет несколько пойло, чтобы получить ViewPager на страницу.
-
После того, как вы находитесь в "рабочей позиции", проведите пальцем по странице работает нормально, как а также Пинч-зум и панорамирование вокруг увеличенного изображения. После этого все позиции работают.
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 вызова этого получает все настроено. Как ни странно, это не требуется, когда изображение не находится внутри Фреймлайаута.
Я бы, конечно, оценил любую очистку кода и все, что мы можем сделать.