获取onTouch事件

时间:2015-08-19 21:51:42

标签: android android-imageview android-gridview android-event

我知道有一些类似的主题已经发布,但我无法找到解决问题的好方法。

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

我首先想到了dp / px转换的问题,我用这种方式尝试了几个解决方案,但没有一个能够工作。 然后我尝试使用getXPrecision(),但我无法制作出有效的解决方案...... 也许有另一种方式?

我想以编程方式创建正确的位置,而不添加常量int,因此我的项目将适用于各种手机和平板电脑,具有不同的dp和分辨率。

编辑:这是一个screenshot,我点击了第一行的第三个单元格,并用getRawX() - getRawY()设置了铅笔的位置。我们可以看到,这不是正确的位置,我希望红点(imageview的中心)位于我点击的位置。

使用的代码:

//获取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:〜解决方案:

JesusMolinaRodríguezDeVera的解决方案没有按预期工作,但我设法做出了可行的解决方案。我只是在事件处理程序中更改了代码以调整图像的位置:

 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);

抱歉我的英语不好:)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

修改

我认为我找到了问题。

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

您可以做的是:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean test = sharedPreferences.getBoolean("test", false);

这应该在选定的点设置ImageView的左上角。为了在这一点设置中心:

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);
[...] 
}

我没有尝试过,但它应该有用。

修改2

只有使用getX()/ getY()而不是getRawX()/ getRawY()

才需要Xoffset和Yoffset