Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView onTouch_Android - Fatal编程技术网

Android GridView onTouch

Android GridView onTouch,android,Android,我正在尝试设置一个按钮的GridView,以响应onTouch。例如,如果我在屏幕上水平、垂直或对角滑动手指,那么我希望选择触摸过的按钮。我尝试为按钮设置OnTouchListener,但没有成功,只有drag事件中的第一个按钮接收onTouch事件 接下来,我尝试为GridView创建一个OnTouchListener,然后使用X,Y坐标来确定哪些按钮被触碰。这似乎也不起作用,因为如果我在GridView的边缘开始拖动,MOTION_DOWN事件只会传递给GridView的onTouch()。

我正在尝试设置一个按钮的GridView,以响应onTouch。例如,如果我在屏幕上水平、垂直或对角滑动手指,那么我希望选择触摸过的按钮。我尝试为按钮设置OnTouchListener,但没有成功,只有drag事件中的第一个按钮接收onTouch事件

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

提前谢谢

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;
 }
}

您可能希望尝试使用手势检测器触发正确的触摸事件。 从那时起,你应该能够确定你做了什么以及具体在哪里


GestureDetector将为您提供多种方法,告诉您所做的事情(单键点击、投掷、滚动等),以及在什么位置和执行此操作的时间(例如,如果您刷卡,您将获得起始位置、刷卡持续时间和刷卡距离)

如果您有一个适配器,请实现一个接口来侦听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){}

            }
        });
建议使用支架来查看适配器内的图元

最后一部分,在活动课上,打电话:

    adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() {

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

它并不完整,但可以帮助你

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;
        }
    });

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

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