获取 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
我知道已经发布了一些类似的主题,但我找不到适合我的问题的解决方案。
我有一个使用自定义 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