android - 通过将 Imageview 左上角视为 (0,0) 来获取 Imageview 的 X,Y 坐标

标签 android coordinates android-imageview ontouchlistener

在我的应用程序中,我使用 Android opencv 方法 检测了图像的边缘。根据结果​​坐标(四个坐标),我在四个角绘制了直线和圆。这些坐标是为选定的图像返回的(通过将图像的左上角视为(0,0))。我需要添加以下任务,用户可以通过触摸Imageview中绘制的圆圈来改变OnTouch()中绘制的线条。为此,我需要 ImageView 中所选触摸部分的 (x,y) 坐标,将 ImageView 左上角视为 (0,0)。我使用此代码 event.getX(),event.getY() 获得了触摸部分的 x,y 坐标,但它返回了基于因此,如果我触摸 ImageView 中的左上角圆圈,它将返回变化的 (x,y) 坐标,它与我通过边缘检测方法绘制的圆圈不同。

我尝试过的代码

 private int fieldImgXY[] = new int[2];


    public static  float ptX1 = 0;
    public static float ptY1 = 0;
    public static float ptX2 = 0;
    public static float ptY2 = 0;
    public static float ptX3 = 0;
    public static float ptY3 = 0;
    public static float ptX4 = 0;
    public static float ptY4 = 0;
 /* ptx1,pty1,ptx2,ptY2 ,ptX3,ptY3,ptX4,ptY4     will get values from Opencv returned coordinates */


        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);

            imageView.getLocationOnScreen(fieldImgXY);

        }

@Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            float x1 = motionEvent.getX();

            float y1 = motionEvent.getY();

             float xOnField = x1 - fieldImgXY[0];
             float yOnField = y1 - fieldImgXY[1];


            if((x1 >= ptX1 - 10 && x1 <= ptX1 + 10)
                    && (y1 >= ptY1 - 10 && y1 <= ptY1 + 10)) {
                bool = true;
                selectedPos = 1;
            }else if((x1 >= ptX2 - 10 && x1 <= ptX2 + 10)
                    && (y1 >= ptY2 - 10 && y1 <= ptY2 + 10)) {
                bool = true;
                selectedPos = 2;
            }
else if((x1 >= ptX3 - 10 && x1 <= ptX3 + 10)
                    && (y1 >= ptY3 - 10 && y1 <= ptY3 + 10)) {
                bool = true;
                selectedPos = 3;
            }


            else if((x1 >= ptX4 - 10  && x1 <= ptX4 + 10)
                    && (y1 >= ptY4 - 10 && y1 <= ptY4 + 10)) {
                bool = true;
                selectedPos = 4;
            }
            else
            {
                bool = false;
                selectedPos = 0;
            }
            return true;
}
else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
//          float x1 = motionEvent.getX();
//          float y1 = motionEvent.getY();
//          Log.i(LOGCAT, "x1=" + x1 + "::y1=" + y1);
            if (bool) {
                bool1 = true;
                bool = false;
            }
            return true;
        } else if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
            float x1 = motionEvent.getX();
            float y1 = motionEvent.getY();
            Log.i(LOGCAT, "x1=" + x1 + "::y1=" + y1);
            if (bool1) {
                clearLine();// for clear the canvas and lines in that image.
                if(selectedPos == 1)
                {
                    ptX1 = x1;
                    ptY1 = y1;
                }
                else if(selectedPos == 2)
                {
                    ptX2 = x1;
                    ptY2 = y1;
                }
                else if(selectedPos == 3)
                {
                    ptX3 = x1;
                    ptY3 = y1;
                }
                else if(selectedPos == 4)
                {
                    ptX4 = x1;
                    ptY4 = y1;
                }
                drawLine(); // draw new lines and circles for latest values
                bool1 = false;
            }
            return true;
        }
}

最佳答案

我使用dp = px * (160/dpi)公式来转换OnTouch事件motionEvent.getX(),motionEvent.getY() 将坐标(像素坐标)返回到 dp 坐标 中。现在我可以使用 MotionEvent.ACTION_MOVE 在屏幕中移动圆圈。

DisplayMetrics dm = getResources().getDisplayMetrics();             

                        float  x1 = event.getX()*(160f/dm.densityDpi);
                        float  y1 = event.getY()*(160f/dm.densityDpi);  

关于android - 通过将 Imageview 左上角视为 (0,0) 来获取 Imageview 的 X,Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091332/

相关文章:

Android - SupportMapFragment with GoogleMaps API 2.0 给出 IllegalArgumentException

android - 未调用适配器中的 ListFragment 未呈现和 getView()

android: RecyclerView inside a ScrollView (or parallax)

python - 从 `matplotlib.pyplot.plot`获取点坐标

javascript - 用 n 个 gps 坐标测量区域

java - 将图像添加到android ListView

android - 图像不填充 ImageView Android 中的宽度

android - 从 View 访问 Activity 的最佳实践

python - 在 python 中绘制带有邻接矩阵和坐标列表的连接图

java - 如何将 android ImageView 捕捉到屏幕上的某个位置?