Android GridView onTouch
我正在尝试设置一个按钮的GridView,以响应onTouch。例如,如果我在屏幕上水平、垂直或对角滑动手指,那么我希望选择触摸过的按钮。我尝试为按钮设置OnTouchListener,但没有成功,只有drag事件中的第一个按钮接收onTouch事件 接下来,我尝试为GridView创建一个OnTouchListener,然后使用X,Y坐标来确定哪些按钮被触碰。这似乎也不起作用,因为如果我在GridView的边缘开始拖动,MOTION_DOWN事件只会传递给GridView的onTouch()。事实上,如果我在网格上水平拖动手指,onTouch事件根本不会触发,除非我在GridView的边缘开始拖动。有人知道更好的方法吗 提前谢谢Android GridView onTouch,android,Android,我正在尝试设置一个按钮的GridView,以响应onTouch。例如,如果我在屏幕上水平、垂直或对角滑动手指,那么我希望选择触摸过的按钮。我尝试为按钮设置OnTouchListener,但没有成功,只有drag事件中的第一个按钮接收onTouch事件 接下来,我尝试为GridView创建一个OnTouchListener,然后使用X,Y坐标来确定哪些按钮被触碰。这似乎也不起作用,因为如果我在GridView的边缘开始拖动,MOTION_DOWN事件只会传递给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;
}
}
您可能希望尝试使用手势检测器触发正确的触摸事件。 从那时起,你应该能够确定你做了什么以及具体在哪里
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);