Android 使用相对坐标在图像视图上绘制点

Android 使用相对坐标在图像视图上绘制点,android,bitmap,imageview,touch-event,Android,Bitmap,Imageview,Touch Event,我正在做地理问答游戏 用户必须在地图上找到一些定义 我制作了一个地图点生成器,它可以计算相对于图像大小的X和Y位置。 因此,地图上该位置的X和Y表示为: 浮动*图像宽度=X 浮动*图像高度=Y 现在,当用户触摸图像视图时,我必须在地图上绘制正确的位置 当图像视图的比例类型定义为“FitXY”时,我的代码使用这些相对坐标和图像边界的大小来计算位置,这很好,但贴图被拉伸,看起来不太好 当我使用“centerInside”比例类型时…地图图像看起来不错,但我的正确位置坐标没有指向正确的位置 如何将这些

我正在做地理问答游戏

用户必须在地图上找到一些定义

我制作了一个地图点生成器,它可以计算相对于图像大小的X和Y位置。 因此,地图上该位置的X和Y表示为: 浮动*图像宽度=X 浮动*图像高度=Y

现在,当用户触摸图像视图时,我必须在地图上绘制正确的位置

当图像视图的比例类型定义为“FitXY”时,我的代码使用这些相对坐标和图像边界的大小来计算位置,这很好,但贴图被拉伸,看起来不太好

当我使用“centerInside”比例类型时…地图图像看起来不错,但我的正确位置坐标没有指向正确的位置

如何将这些坐标转换为与屏幕上绘制的真实图像相对应的坐标

我还需要位图的触摸坐标,而不是图像视图的触摸坐标……这样我就可以计算出正确位置和触摸位置之间的距离

如何在ImageView内的屏幕上绘制位图画布

这让我有点困惑

有什么想法吗

Tnx

编辑:

这是我目前的代码:

Drawable Drawable=stageImage.getDrawable(); Rect imageBounds=drawable.getBounds()

//可见(缩放)图像的高度和宽度
int scaledHeight=imageBounds.height();
int scaledWidth=imageBounds.width();
矩阵逆=新矩阵();
stageImage.getImageMatrix().invert(逆);
//将触摸点从ImageView映射到图像
float[]接触点=新的float[]{event.getX(),
event.getY()};
反向映射点(接触点);
//相对接触点
float relativeX=接触点[0]/缩放宽度;
float relativeY=接触点[1]/缩放高度;
//防止错误
if(relativeX<0){
相对性=0;
}
if(relativeX>1){
相对性=1;
}
如果(相对值小于0){
相对性=0;
}
如果(相对值Y>1){
相对性=1;
}
touchX=event.getX();
touchY=event.getY();
//这很好用!!!!!
//画接触点
stageImage.drawTouchedSpot(touchX,touchY);
//获得正确的相对位置并绘制它
double correctRelativeX=gameHandler
.getCurrentMapElement().getxCoordinate()
*imageBounds.width();
double correctRelativeY=gameHandler
.getCurrentMapElement().getyCoordinate()
*imageBounds.height();
//当舞台图像比例类型为“中间内”时,这不正确
stageImage.drawFlag(correctRelativeX,correctRelativeY);

您所要做的就是使用ImageView.getImageMatrix()

我想我找到了所有问题的答案

我的代码非常有效,这里介绍的小魔术如下:

我已将图像缩放类型设置为“centerInside”,但使用scaleImage()方法,我可以调整图像视图的大小以适合位图图像

这样,相对坐标是正确的,我可以在定义为正确的位置绘制动画!反正是Tnx


如果你有更好的想法…我很高兴尝试一下…我想这不是最优化的方法

这里的映射应该已经考虑了缩放的宽度/高度

float[] touchPoint = new float[] { event.getX(), event.getY() };
inverse.mapPoints(touchPoint);
所以我认为你不需要这个:

            // Relative touch points
            float relativeX = touchPoint[0] / scaledWidth;
            float relativeY = touchPoint[1] / scaledHeight;

另外,尝试将缩放类型更改为scale_type.MATRIX,并使用imageView的
getImageMatrix()
修改视图。

我猜是这样的……但在相反的方向上……例如,我有一个城市的宽度为原始图像的0.5*宽,高度为原始图像的0.3*高……现在我想在该位置绘制一些旗帜动画……但当图像的缩放类型为“中心内部”时,它是不正确的……当它为“FitXY”时,它就可以了但是地图看起来很难看,很糟糕。所以我建议用一些正方形创建测试图像,然后点击它的边缘来测试代码,确保把它放在drawable Nodepi文件夹中
            // Relative touch points
            float relativeX = touchPoint[0] / scaledWidth;
            float relativeY = touchPoint[1] / scaledHeight;