获取 gridview 中触摸项目的坐标

Getting the coordinates of a touched item inside a gridview

我有一个 gridview,其中包含一些项目。我想在触摸网格中的任何项目时获取屏幕相关坐标。

我知道我可以使用 MotionEvent.getRawXMotionEvent.getRawY 来做到这一点。问题是我无法在网格内的项目上设置触摸侦听器,它不触发,我不知道为什么。我试图为 gridview 本身设置侦听器,这有效,但是一旦我触摸任何项目,回调就会被调用不止一次(2-4 次)。这是我的代码:

public class Calibration extends Activity {

    List<String> list;
    GridView grid; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calibration_activity);

        list = new ArrayList<String>();
        grid = (GridView) findViewById(R.id.gridView1);


        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        list.add("8");
        list.add("9");

        ArrayAdapter<String> adp = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, list);
        grid.setAdapter(adp);




    /*Working but appears 2-4 times*/
        grid.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                Toast.makeText(getBaseContext(), "( " + motionEvent.getRawX() + ", " + motionEvent.getRawY() + ")",
                        Toast.LENGTH_LONG).show();
                return false;
            }
        });
    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/gridView1"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:numColumns="auto_fit"
          android:background="#7CFC00"
          android:gravity="center"
          android:columnWidth="100dp"
          android:stretchMode="columnWidth" />

请注意,我的目标是在 gridView 中包含 ImageView 而不是字符串值。我尝试在适配器中填充 ImageView,然后在其上设置侦听器,但这没有用。所以,我只是使用字符串值作为这个问题的例子。

我该如何解决这个问题?

更新您的 onTouch 方法以仅在用户手指离开 gridview 时显示 toast (ACTION_UP)

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if(motionEvent.getAction() == KeyEvent.ACTION_UP) {
        Toast.makeText(getBaseContext(), "( " + motionEvent.getRawX() + ", " + motionEvent.getRawY() + ")",
                Toast.LENGTH_LONG).show();
        return true;
    }
    else
        return false;
}

您可以尝试检查其他KeyEvent条件,例如ACTION_DOWN。这由你决定

文档是HERE

ACTION_DOWN -> 按键已被按下。

ACTION_MULTIPLE-> 您正在按下并滑动屏幕(发送此事件直到用户释放屏幕)

ACTION_UP -> 密钥已释放。