2

我正在尝试在 GLSurfaceview 中实现捏合缩放,但无法使其正常工作。我知道如何放大图片的中心,这很容易(我发布的示例已经可以缩放到图片的中心)。但我不知道如何考虑手指坐标。

该项目本身是一个画廊应用程序,所以我不需要任何花哨的 3D 旋转。我需要了解如何根据双指缩放手势放大图像的一部分。很可能这可能是 3-5 行代码的问题,但我没有找到正确的方法来做到这一点。

这意味着场景矩阵不仅在 Z 轴上平移以进行缩放,而且还平移(移动)了某个 deltaX 和 deltaY 数量 - 以保持您正在放大的点在它的位置。

我的场景是这样设置的:

(渲染模式设置为 RENDERMODE_WHEN_DIRTY)

    // Screen size (in screen pixels.
    private int mViewportWidth;
    private int mViewportHeight;
    // Rectangle for render area.
    private RectF mViewRect = new RectF();

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        mViewportWidth = width;
        mViewportHeight = height;

        float ratio = (float) width / height;
        mViewRect.top = 1.0f;
        mViewRect.bottom = -1.0f;
        mViewRect.left = -ratio;
        mViewRect.right = ratio;

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, 20f, (float) width / height, .1f, 100f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

应实现捏拉缩放的绘图区域:

@Override
public synchronized void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    //Pinch-To-Zoom transformation should be implemented here
    //code below doesn't work
    gl.glTranslatef(-delta.x,-delta.y, -currentScale);

    //the drawing is done here
    //...
}

我在同一个渲染类的方法中得到捏合手势和缩放之间的中间点:

private float currentScale = 6f;
/**
 * 
 * @param scaleAbsolute - scale value from ScaleGestureListener
 * @param focusX - X coordinate of pinch-to-zoom gesture in screen coordinates
 * @param focusY - Y coordinate of pinch-to-zoom gesture in screen coordinates
 */
public void zoom(float scaleAbsolute, float focusX, float focusY) {
    //the initial value of currentScale is 6f and by zooming in, we are decresing this value
    //currentScale is used as the Z value (so lower number = bigger zoom)
    currentScale = currentScale / scaleAbsolute;

    //Keep track of deltaX/deltaY here? How?

}

我认为应该添加一个全局 deltaX 和 deltaY 值,但我不知道如何根据当前缩放级别计算 X、Y 偏移。

这是一个将屏幕坐标转换为场景坐标的辅助函数:

/**
 * Translates screen coordinates into view coordinates.
 */
public void translate(PointF pt) {
    pt.x = mViewRect.left + (mViewRect.width() * pt.x / mViewportWidth);
    pt.y = mViewRect.top - (-mViewRect.height() * pt.y / mViewportHeight);
}
4

0 回答 0