AbsListView消耗触摸事件

时间:2011-06-20 19:10:13

标签: android touch widget

我有一个ViewFlipper,里面有几个GridView。我希望能够与GridViews交互并滑动以从一个网格切换到另一个网格。运行AbsListView的问题是通过返回true来消耗触摸事件,无论它做了什么。我发现this post表示我尝试onInterceptTouchEvent(),但这不起作用。由于我正在尝试使用GestureDetector,它似乎无法正确跟踪触摸。

使用该帖子中的方法我使用onInterceptTouchEvent()打印出截获的触摸,但我没有始终获得MOTION_UP个事件。我看到MOTION_DOWN,多个MOTION_MOVEMOTION_UP

1 个答案:

答案 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;
        }
    }
}
相关问题