我正在为Android构建一个“导航类型”应用程序。
对于导航部分,我正在构建一个Activity,用户可以使用触摸事件移动和缩放地图(这是一个位图),并且地图也可以使用指南针围绕屏幕中心旋转。
我正在使用Matrix来缩放,移调和旋转图像,而不是将其绘制到画布上。
以下是加载视图时调用的代码,用于将图像置于屏幕中心:
image = new Matrix();
image.setScale(zoom, zoom);
image_center = new PointF(bmp.getWidth() / 2, bmp.getHeight() / 2);
float centerScaledWidth = image_center.x * zoom;
float centerScaledHeigth = image_center.y * zoom;
image.postTranslate(
screen_center.x - centerScaledWidth,
screen_center.y - centerScaledHeigth);
使用 postRotate 方法进行图像旋转。
然后在 onDraw()方法中我只调用
canvas.drawBitmap(bmp, image, drawPaint);
问题在于,当用户触摸屏幕时,我想要触摸图像上的点,但显然我无法获得正确的位置。 我试图反转图像矩阵并翻译触摸点,但它无效。
有人知道如何翻译点坐标吗?
修改
我正在使用此代码进行翻译。 dx 和 dy 是从 onTouch 侦听器获取的翻译值。 * new_center *是这种形式的浮点值数组{x0,y0,x1,y1 ...}
Matrix translated = new Matrix();
Matrix inverted = new Matrix();
translated.set(image);
translated.postTranslate(dx, dy);
translated.invert(inverted);
inverted.mapPoints(new_center);
translated.mapPoints(new_center);
Log.i("new_center", new_center[0]+" "+new_center[1]);
其实我尝试使用* new_center = {0,0} *:
仅应用已翻译的矩阵,我得到了bmp的(0,0)点与屏幕的(0,0)点之间的距离,但似乎没有考虑到轮换。
将倒置矩阵应用于得到这些结果的点,以一切可能的方式移动图像。
12-26 13:26:08.481: I/new_center(11537): 1.9073486E-6 -1.4901161E-7
12-26 13:26:08.581: I/new_center(11537): 0.0 -3.874302E-7
12-26 13:26:08.631: I/new_center(11537): 1.9073486E-6 1.2516975E-6
12-26 13:26:08.781: I/new_center(11537): -1.9073486E-6 -5.364418E-7
12-26 13:26:08.951: I/new_center(11537): 0.0 2.682209E-7
12-26 13:26:09.093: I/new_center(11537): 0.0 7.003546E-7
相反,我正在考虑图像上翻译的坐标。
我的想法是否正确?
答案 0 :(得分:2)
好的,我明白了。
首先,我将旋转与图像的平移和缩放分开。
因为我创建了一个自定义ImageView,所以这很简单。我将旋转应用于ImageView的画布,以及其他转换为图像矩阵。
我通过全局矩阵变量得到了canva矩阵的踪迹。
一些代码:
要为相应的 onTouch 事件设置正确的移动,首先我“回转”从 onTouch 传递的点数(开始和< em> stop points)使用 canvas
矩阵的逆然后我计算x和y之间的差异,并将其应用于图像矩阵。
float[] movement = {start.x, start.y, stop.x, stop.y};
Matrix c_t = new Matrix();
canvas.invert(c_t);
c_t.mapPoints(movement);
float dx = movement[2] - movement[0];
float dy = movement[3] - movement[1];
image.postTranslate(dx, dy);
如果您要检查图像移动是否超出其大小,请在 image.postTranslate(dx,dy); 之前放置此代码:
float[] new_center = {screen_center.x, screen_center.y};
Matrix copy = new Matrix();
copy.set(image);
copy.postTranslate(dx, dy);
Matrix translated = new Matrix();
copy.invert(translated);
translated.mapPoints(new_center);
if ((new_center[0] > 0) && (new_center[0] < bmp.getWidth()) &&
(new_center[1] > 0) && (new_center[1] < bmp.getHeight())) {
// you can remove the image.postTranslate and copy the "copy" matrix instead
image.set(copy);
...
重要的是要注意:
A)图像的中心旋转是屏幕的中心,因此在画布旋转期间不会改变坐标
B)您可以使用屏幕中心的坐标来获取图像的旋转中心。
使用此方法,您还可以将每个触摸事件转换为图像坐标。