GridView onTouch

时间:2010-05-13 14:32:51

标签: android

我正在尝试设置一个响应onTouch的按钮GridView。例如,如果我水平,垂直或对角地在屏幕上滑动手指,那么我希望选择被触摸的按钮。我尝试为按钮设置OnTouchListener,但这不起作用,只有拖动事件中的第一个按钮接收到onTouch事件。

接下来,我尝试为GridView创建一个OnTouchListener,然后使用X,Y坐标来确定触摸的按钮。这似乎不起作用,因为如果我在GridView的最边缘开始拖动,MOTION_DOWN事件只传递给GridView的onTouch()。实际上,如果我将手指水平拖过网格,除非我在GridView的边缘开始拖动,否则根本不会触发onTouch事件。有谁知道更好的方法吗?

提前致谢。

gridview.setOnTouchListener(new View.OnTouchListener()
{
 @Override
 public boolean onTouch(@SuppressWarnings("unused") View view, MotionEvent event)
 {
  float X = event.getX();
  float Y = event.getY();

  switch (event.getAction()) { 
  case MotionEvent.ACTION_DOWN:
   System.out.println("Down: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_MOVE:
   System.out.println("Move: " + X + "," + Y);
   break;
  case MotionEvent.ACTION_UP: 
   System.out.println("Up: " + X + "," + Y);
   break; 
  }

  return true;
 }
}

4 个答案:

答案 0 :(得分:1)

如果你有一个适配器实现一个接口来监听gridcell上的点击事件,例如:

public interface OnSaveEditsListener
{
    public abstract void onSaveEdits();
}

private OnSaveEditsListener saveEditsListener = null;
public void setOnSaveEditsListener(OnSaveEditsListener l) {
    saveEditsListener = l;
}

你应该在你的适配器getView(..)方法中实现特殊的点击监听器:

        holder.gridcell.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CalendarPosition = position;
                v.requestFocusFromTouch();

                try{
                    saveEditsListener.onSaveEdits();
                    holder.gridcell.invalidate();
                }catch(Exception ex){}

            }
        });

建议在适配器内使用视图元素。

最后一部分,来自您的Activity类,只需调用:

    adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() {

        @Override
        public void onSaveEdits() {
            /** methods  *//
    });
}

答案 1 :(得分:0)

您可能想尝试使用GestureDetector来获取正确的触摸事件。 从那以后,你应该能够确定你做了什么,到底在哪里。

GestureDetector将为您提供几种方法,告诉您您做了什么(SingleTapUp,Fling,Scroll,...)以及您在什么位置以及执行此操作的时间(例如,如果您滑动,则会获得起始位置,持续时间滑动以及你刷了多远)

答案 2 :(得分:0)

它不完整但可以帮助你

gridview.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_MOVE){
                gridview.requestFocusFromTouch();
                gridview.setSelection(gridview.pointToPosition((int)event.getX(),(int)event.getY()));
                return true;
            }
            if(event.getAction() == MotionEvent.ACTION_UP){
                gridview.clearFocus();
                return true;
            }

            return false;
        }
    });

答案 3 :(得分:0)

你走在正确的轨道上。您只需使用onTouch中的X,Y坐标来使用gridView的pointToPosition方法获取网格单元的位置。然后,您可以使用位置(ID)使用getChildAt方法获取单元格中的实际项目。例如,如果gridView在每个单元格中都有TextView,则使用此

int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
TextView tv = (TextView) gridView.getChildAt(position);