【发布时间】:2014-06-04 16:14:39
【问题描述】:
我认为这个问题经常被问到,但我找不到适合我的实施的解决方案。我使用 onScaleListener 和 onGestureListener 构建了一个自定义图像视图,用于缩放和平移包含的图像。缩放是通过矩阵缩放完成的。函数如下所示:
@Override
public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
scaleFactor *= scaleGestureDetector.getScaleFactor();
scaleFactor = Math.max(initScale, Math.min(scaleFactor, initScale + 3.0f));
matrix = getImageMatrix();
matrix.setScale(scaleFactor, scaleFactor);
matrix.getValues(values);
matrix.postTranslate(-values[Matrix.MTRANS_X] + Math.max(0, centerX - centerImageX),
-values[Matrix.MTRANS_Y] + Math.max(0, centerY - centerImageY));
setImageMatrix(matrix);
}
如果需要,需要 postTranslate() 来使图像居中。要完成此操作,我需要滚动到 (scrollTo(x,y)) 缩放手势的焦点保持在屏幕上相同位置的位置。最后,它应该看起来像在 web 视图中缩放。
有人可以帮我解决这个问题吗?
当我使用时:
float scrollPosX = ((scrollwidth) * ((getScrollX() + touchX) / imagewidth));
float scrollPosY = ((scrollheight) * ((getScrollY() + touchY) / imageheight));
它适用于第一次缩放,但在缩放图像中缩放时它将滚动到相对位置。我认为这都与我仅使用 getScrollX() 和 getScrollY() 获得触摸位置的事实有关[很难解释]
【问题讨论】:
-
如果您愿意使用库来执行此操作,我的自定义图像视图类支持捏合缩放,并在您捏合时移动图像以保持捏合的中心点在开始时对齐当您将手指合拢/分开时以中心点为中心。不是一个很好的解释,但我认为这就是你的意思:-) github.com/davemorrissey/subsampling-scale-image-view
-
很好的代码,非常感谢。但我更喜欢完成我的代码,因为我需要从网络加载图像,它几乎完成了,我花了很多时间。