我知道有一些类似的主题已经发布,但我无法找到解决问题的好方法。
我有一个使用自定义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);
抱歉我的英语不好:)
感谢您的帮助!
答案 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