我正在尝试在 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);
}