居中放大自定义视图 - 计算画布坐标

时间:2011-03-18 20:31:37

标签: android view zoom

我正在开发我的第一个“真正的”Android应用程序,一个图形工作流编辑器。绘图是在一个自定义类中完成的,它是View的子类。当我的元素是矩形时,它们在画布上绘制。为了检测元素上的动作,我比较坐标并检查触摸位置上的元素。

为了实现缩放手势,我尝试了http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

使用4参数canvas.scale(...)函数,居中缩放效果很好,但是我无法使用mPosX和mPosY的偏移来计算画布坐标,以检测缩放后的触摸是否在元件。

我尝试更改上面博文中的示例,将画布置于缩放手势的中心位置:

canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor, mScalePivotX, mScalePivotY);
//drawing ....
canvas.restore();

在没有丢失参考偏移量来计算坐标的情况下,我没有找到任何关于如何做到这一点的例子。有一个简单的解决方法吗?我试图用手势中心和比例因子来计算偏移量,但是失败了:/

我已经看到使用ImageView的其他示例经常使用Matrix来转换图像。这可以通过自定义视图和画布完成吗?如果是,我如何获得x和y偏移来检查坐标?

另外,如果我的想法完全错误,我会很高兴看到一些关于如何正确完成的例子。

THX! ;)

1 个答案:

答案 0 :(得分:3)

以下代码可能会帮助您计算手势中心的坐标和缩放系数。我在代表opengl-sprite的类中使用此方法。

void zoom(float scale, PointF midPoint) {
    if (zoomFactor == MAX_ZOOM_FACTOR && scale > 1) return;
    if (zoomFactor == MIN_ZOOM_FACTOR && scale < 1) return;

    zoomFactor *= scale;
    x = (x - midPoint.x) * scale + midPoint.x;
    y = (y - height + midPoint.y) * scale + height - midPoint.y;
    if (zoomFactor >= MAX_ZOOM_FACTOR) {
        zoomFactor = MAX_ZOOM_FACTOR;
    } else if (zoomFactor < MIN_ZOOM_FACTOR) {
        zoomFactor = MIN_ZOOM_FACTOR;
        x = 0;
        y = 0;
    }
}

X和Y坐标以不同方式处理,因为opengl坐标系(right和up)和midPoint坐标系(right和down)的方向有所不同。 midPoint取自MotionEvent坐标。

我认为所有其他操作都是可以理解的。

希望它会对你有所帮助。