我有一个ViewFlipper,里面有几个GridView。我希望能够与GridViews交互并滑动以从一个网格切换到另一个网格。运行AbsListView的问题是通过返回true来消耗触摸事件,无论它做了什么。我发现this post表示我尝试onInterceptTouchEvent()
,但这不起作用。由于我正在尝试使用GestureDetector,它似乎无法正确跟踪触摸。
使用该帖子中的方法我使用onInterceptTouchEvent()
打印出截获的触摸,但我没有始终获得MOTION_UP
个事件。我看到MOTION_DOWN
,多个MOTION_MOVE
和MOTION_UP
。
答案 0 :(得分:0)
好吧,如果有人在寻找答案,这就是我提出的解决方案!基本设置是我有一个FrameLayout
,其中包含ViewFlipper
,我根据我必须显示的项目向GridView
添加ViewFlipper
。我检测到FrameLayout
上的滑动并在GridView
中的ViewFlipper
之间切换。我仍然需要点击GridView
中的项目,因此我不能只使用FrameLayout
中的事件,但GridView
会消耗它所获得的任何事件,因此我必须拦截在他们到达GridView
之前的事件并将它们交给我的GestureDetector
。
public class PagedGrid extends FrameLayout
{
private Context _context;
private ViewFlipper _flipper;
private GestureDetector _gestureDetector;
public PresentationsGrid(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
LayoutInflater.from(context).inflate(R.layout.presentation_grid, this, true);
_flipper = (ViewFlipper)findViewById(R.id.flipper);
_gestureDetector = new GestureDetector(new GestureListener());
setFocusable(true);
setFocusableInTouchMode(true);
setClickable(true);
_context = context;
// ... Add Pages ...
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
return _gestureDetector.onTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
_gestureDetector.onTouchEvent(event);
return false;
}
}
然后我将GridView
子类化以跟踪其状态并合理地传递事件。
public class UnNomableGridView extends GridView
{
private boolean _wasDown;
public UnNomableGridView(Context context)
{
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if(!_wasDown && event.getActionMasked() == MotionEvent.ACTION_DOWN)
{
super.onTouchEvent(event);
_wasDown = true;
return true;
}
else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_UP)
{
super.onTouchEvent(event);
_wasDown = false;
return true;
}
else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_CANCEL)
{
super.onTouchEvent(event);
_wasDown = false;
return true;
}
else
{
return false;
}
}
}