在相对坐标android的图像视图上绘制点

时间:2013-08-01 09:37:02

标签: android bitmap imageview touch-event

我正在研究一些地理问答游戏。

用户必须在地图上找到一些已定义的内容。

我制作了地图点生成器,用于计算相对于图像大小的X和Y位置。 所以地图上的地方的X和Y表示为: float * imageWidth = X. float * imageHeight = Y;

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

当图像视图的比例类型被定义为“FitXY”时,我的代码用这些相对坐标和图像边界的大小来计算位置,并且工作正常,但是地图被拉伸并且看起来不太好。

当我使用“centerInside”比例类型时...地图图像看起来很好,但我的正确位置的坐标并不指向正确的位置。

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

另外我需要位图的触摸坐标而不是图像视图...所以我可以计算正确位置和触摸位置之间的距离。

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

这对我来说有点混乱......

有什么想法吗?

TNX?

编辑:

到目前为止,这是我的代码:

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

                // height and width of the visible (scaled) image
                int scaledHeight = imageBounds.height();
                int scaledWidth = imageBounds.width();

                Matrix inverse = new Matrix();
                stageImage.getImageMatrix().invert(inverse);

                // map touch point from ImageView to image
                float[] touchPoint = new float[] { event.getX(),
                        event.getY() };
                inverse.mapPoints(touchPoint);

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

                // Prevent errors
                if (relativeX < 0) {
                    relativeX = 0;
                }

                if (relativeX > 1) {
                    relativeX = 1;
                }

                if (relativeY < 0) {
                    relativeY = 0;
                }

                if (relativeY > 1) {
                    relativeY = 1;
                }


                touchX = event.getX();
                touchY = event.getY();

     //THIS WORKS FINE!!!!!
                // Draw touched point
                stageImage.drawTouchedSpot(touchX, touchY);

                // Get correct relative position and draw it
                double correctRelativeX = gameHandler
                        .getCurrentMapElement().getxCoordinate()
                        * imageBounds.width();
                double correctRelativeY = gameHandler
                        .getCurrentMapElement().getyCoordinate()
                        * imageBounds.height();

    //THIS IS NOT RIGHT WHEN STAGE IMAGE SCALE TYPE IS "CENTER INSIDE"
                stageImage.drawFlag(correctRelativeX, correctRelativeY);

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我的代码效果很好,这里描述的小魔法:

http://argillander.wordpress.com/2011/11/24/scale-image-into-imageview-then-resize-imageview-to-match-the-image/

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

这样相对坐标是正确的,我可以在定义为正确的地方绘制动画!无论如何,Tnx!

如果你有更好的想法...我很乐意尝试...我想这不是最优化的方法

答案 2 :(得分:0)

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

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&#39; getImageMatrix()修改视图。