android - 在自定义 View 中居中缩放 - 计算 Canvas 坐标

标签 android view zooming

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

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

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

我尝试更改上面博文中的示例,使 Canvas 在缩放手势上居中:

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

我没有找到任何示例说明如何在不丢失计算坐标的引用偏移量的情况下完成此操作。有简单的解决方法吗?我试图用手势中心和比例因子计算偏移量,但失败了:/

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

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

谢谢! ;)

最佳答案

也许以下代码可以帮助您计算手势中心坐标和比例因子。我在代表 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 坐标系(右和下)的方向不同。中点取自 MotionEvent 的坐标。

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

希望对你有所帮助。

关于android - 在自定义 View 中居中缩放 - 计算 Canvas 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357522/

相关文章:

php - 如何从第三个表中获取数据?

swift - macOS - Swift 4.0 容器 View 不显示 NSView

javascript - 鼠标滚动缩放不适用于仪表板图表

jquery-plugins - jQuery gzoom 插件不起作用

android - AS3 Android Air,音频流错误

android - 如何强制使用溢出菜单而不是 native 菜单?

android - 保存的游戏 + 实时多人 Android

Mysql创建SQL子查询ALIAS

image - 在 windows phone 上的滚动查看器中实现图像缩放

java - 从 Json 获取字符串而不出现 OutOfMemoryError