获取 onTouch 事件的真实 X/Y 位置

Get the real X/Y position of an onTouch Event

我知道已经发布了一些类似的主题,但我找不到适合我的问题的解决方案。

我有一个使用自定义 ImageAdapter 归档的 GridView。一切正常,但每当我单击 GridView 中包含的图像时,我想在单击位置移动另一个 Imageview。 但是,我用 event.getX()event.getY() 获取的事件坐标与点击的位置不对应。

我首先想到了一个dp/px转换的问题,我尝试了几种这样的解决方案,但其中none都有效。 然后我尝试使用 getXPrecision(),但我无法做出有效的解决方案...... 也许还有其他方法?

我想以编程方式做出正确的位置,而不添加常量 int,因此我的项目将在各种 phone 和平板电脑上运行,具有不同的 dp 和分辨率。

编辑:这里是 screenshot,我点击了第一行的第三个单元格,并使用 getRawX() - getRawY() 设置了铅笔的位置。正如我们所见,这不是正确的位置,我希望红点(图像视图的中心)位于我点击的位置。

使用的代码:

//获取onTouch事件的位置:

    GridView centre = (GridView) findViewById(R.id.gridView);
    adapter = new ImageAdapter(this, (dim * dim), tailleCell);
    centre.setAdapter(adapter);

    centre.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View view, MotionEvent event) {

            int X = (int)event.getRawX();
            int Y = (int)event.getRawY();
            animation(X, Y, etat);
            return false;
        }
    });`

//启动动画(并设置铅笔位置):

  private void animation(int posX, int posY, int etat)
  {
    final ImageView img;
    if(etat == 0)
    {
       img = (ImageView) findViewById(R.id.imageView);
    }
    else
    {
        img = (ImageView) findViewById(R.id.imageView2);
    }

    img.clearAnimation();
    img.setVisibility(View.VISIBLE);

    img.setX(posX);
    img.setY(posY);
    [...]
  }

编辑 2:~解决方案:

Jesus Molina Rodríguez De Vera 的解决方案没有按预期工作,但我设法制定了一个可行的解决方案。我刚刚更改了事件处理程序中的代码以调整图像的位置:

 int[] offset = new int[2];
 centre.getLocationOnScreen(offset);
 int Xoffset=offset[0];
 int Yoffset = offset[1];
 int X = (int)event.getRawX();
 int Y = (int)event.getRawY();
 animation(X-((int)Math.round(Xoffset/1.15)), Y-((int)Math.round(Yoffset/1.5)), etat);

抱歉我的英语不好:)

感谢您的帮助!

尝试使用 getRawX() 和 getRawY() 而不是 getX 和 getY。

编辑

我想我已经找到问题了。

您正在获取相对于 GridView 左上角的 X 和 Y,而不是绝对屏幕坐标。

您可以做的是:

int[] offset = new int[2];
center.getLocationOnScreen(offset);
int Xoffset=offset[0];
int Yoffset = offset[1];

private void animation(int posX, int posY, int etat){ 

//...

img.setX(posX+Xoffset);
img.setY(posY+Yoffset);
[...] 
}

这应该在所选点中设置 ImageView 的左上角。为了在那个点设置中心:

int ivWidth = img.getWidth();
int ivHeight = img.getHeight();

private void animation(int posX, int posY, int etat){ 

//...

int[] finalPosition=new int[2];
finalPosition[0] = posX+Xoffset-(ivWidth/2);
finalPosition[1] = posY+Yoffset-(ivHeight/2);
img.setX(finalPosition[0]);
img.setY(finalPosition[1]);
[...] 
}

我没试过,但应该可以。

编辑 2

仅当您使用 getX()/getY() 而不是 getRawX()/getRawY() 时才需要 Xoffset 和 Yoffset