gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:18:02 27 4
gpt4 key购买 nike

在我的应用程序中,我使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com