Android自定义imageview,具有类似webview的缩放功能

时间:2014-06-04 16:14:40

标签: android imageview scaling

我认为这个问题经常被问到,但我找不到适合我实施的解决方案。我使用 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))缩放手势的焦点保持在屏幕上的相同位置的位置。最后它应该看起来像在webview中缩放。  任何人都可以帮我这个吗? 当我使用时:
        float scrollPosX =((scrollwidth)*((getScrollX()+ touchX)/ imagewidth));
        float scrollPosY =((scrollheight)*((getScrollY()+ touchY)/ imageheight));
它将适用于第一次缩放,但在缩放图像缩放时,它将滚动到相对位置。我认为这一切都与我只能通过 getScrollX() getScrollY()获得触摸位置的事实相关[很难解释]

1 个答案:

答案 0 :(得分:1)

现在我找到了一个适合我的解决方案。在我的情况下,我必须使用缩放步骤而不是缩放因子。

                scrollTo((int) (getScrollX() - x + (scaleGestureDetector.getScaleFactor() * x) ),
                         (int) (getScrollY() - y + (scaleGestureDetector.getScaleFactor() * y) ));

将x和y作为缩放图像上的触摸位置。