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

6
我正在开发我的第一个“真正的”Android应用程序,一个图形化的工作流编辑器。绘图是在自定义类中完成的,该类是View的子类。目前我的元素是矩形,在画布上绘制。为了检测元素上的操作,我比较坐标并检查触摸位置上的元素。
为了实现缩放手势,我尝试使用http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html
使用四个参数的canvas.scale(...)函数可以很好地实现居中缩放,但我失去了使用mPosX和mPosY偏移量计算画布坐标以检测缩放后触摸是否在元素上的能力。
我尝试通过更改上述博客文章中的示例来使画布在缩放手势上居中:
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor, mScalePivotX, mScalePivotY);
//drawing ....
canvas.restore();

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

我已经看到其他使用ImageView的示例通常使用Matrix来转换图像。是否可以使用自定义View和Canvas来完成这个操作?如果可以,如何获取x和y偏移量以检查坐标?

此外,如果我的想法完全错误,我会很高兴看到一些关于正确实现的示例。

谢谢! ;)


你好,我遇到了居中缩放的问题。目前当我进行缩放时,它会跳转到点(0,0),我正在使用canvas.scale(scaleFactor, scaleFactor)方法。你是如何计算ScalePivotX和scalePivotY的呢?谢谢。 - sajjoo
1个回答

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坐标系统(右和上)和midPoint坐标系统(右和下)的方向有所区别。 midPoint是从 MotionEvent 的坐标中获取的。

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

希望这可以帮助您。


抱歉,我完全忘记了这个问题。最终我想到了一个非常相似的解决方案,但是我没有代码可以更新我的问题。谢谢。 - m4tt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接