То, как я справился с этим, заключается в создании подклассов галереи и переопределении OnScroll, OnFling и OnTouch, передавая события в scaledetector и отправляя их в суперкласс, когда я на краю изображения, и переводя изображение, когда я не на нем. Имейте в виду, что это все еще в стадии разработки, но в данный момент это самое близкое мне решение к рабочему решению.
Ака, это работает, но это "странно".
private class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor = detector.getScaleFactor();
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
Log.d(TAG, "" + mScaleFactor);
scale(mScaleFactor, detector.getFocusX(), detector.getFocusY());
return true;
}
}
И
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (matrix == null)
matrix = new Matrix();
matrix.set(getSelectedImageView().getImageMatrix());
} else if (event.getAction() == MotionEvent.ACTION_UP
&& event.getPointerCount() == 0) {
scrolling = 0;
}
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
И
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
if (mScaleDetector.isInProgress()) {
scrolling = 0;
return true;
} else if (isAtRightEdge() && distanceX > 1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else if (isAtLeftEdge() && distanceX < -1) {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
} else {
if (scrolling < 0.1 && scrolling > -0.1) {
matrix.postTranslate(-distanceX, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
return false;
} else {
matrix.postTranslate(0, -distanceY);
getSelectedImageView().setImageMatrix(matrix);
scrolling += distanceX;
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
}