我正在开发我的第一个“真正的”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! ;)
答案 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
坐标。
我认为所有其他操作都是可以理解的。
希望它会对你有所帮助。