2

我有一个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" /> 

请注意,我的目标是有ImageViewgridView不是字符串值内。我尝试让ImageView填充到适配器中,然后在其上设置侦听器,但那不起作用。所以,我只是使用String值作为这个问题的一个例子。

我该如何解决这个问题?

回答

1

更新您的onTouch方法来显示,只有当用户的手指离开GridView控件(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 - >键已被释放。

+0

谢谢Guilherme P为你有用的答案,我需要某个时间来尝试解决方案。我会尝试并让你知道。但是,您能否告诉我为什么多次调用回调?是否因为多个事件同时发生?谢谢。 – Dania