我正在尝试设置一个响应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;
}
}
答案 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);