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

m4t*_*4tt 6 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!;)

And*_*yeu 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于opengl坐标系(右上)和midPoint坐标系(右下)方向的区别,X和Y坐标的处理方式不同。midPoint 取自MotionEvents 坐标。

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

希望它能帮助你。