将触摸事件发送到ViewPager的未聚焦片段

时间:2016-01-07 16:38:09

标签: android android-fragments android-viewpager

我已经实现了Dave Smith优雅的解决方案来显示multiple views inside a ViewPager here,但是在将触摸事件发送到不是“聚焦”的片段时遇到了麻烦。

在他的PagerContainer解决方案中,有一些功能可以处理ViewPager聚焦区域之外的触摸事件(见下文),但这只是为了启用滚动功能。我需要这些触摸事件实际上与片段本身的视图进行交互。

有没有人有这方面的经验?

@Override
public boolean onTouchEvent(MotionEvent ev) {
    //We capture any touches not already handled by the ViewPager
    // to implement scrolling from a touch outside the pager bounds.
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mInitialTouch.x = (int)ev.getX();
            mInitialTouch.y = (int)ev.getY();
        default:
            ev.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
            break;
    }

    return mPager.dispatchTouchEvent(ev);
}

如何将PagerContainer中的触摸事件传播到相应的片段?

3 个答案:

答案 0 :(得分:0)

您可以使用事件总线来检查此链接如何使用它。我已经将它用于活动和片段之间的这种通信。 https://github.com/greenrobot/EventBus

答案 1 :(得分:0)

所以,我已经实施了部分解决方案,但这不是最终答案。在PagerContainer中重写的OnTouchEvent中,我现在正在检查每个片段的HitRect并确定事件的内部片段。问题现在呢?如何停止滚动到已选择的片段。

这是我尝试过的,但它仍然滚动到点击的片段。关于如何制止这个的任何想法?

@Override
public boolean onTouchEvent(MotionEvent evt) {

    //We capture any touches not already handled by the ViewPager
    // to implement scrolling from a touch outside the pager bounds.
    int fragCount = mPager.getAdapter().getCount();
    for(int i = 0; i < fragCount; i++)
    {
        View view = mPager.getChildAt(i);
        Rect rect = new Rect();
        view.getHitRect(rect);

        if(rect.contains((int)evt.getX(),(int)evt.getY()))
        {
            int currentItem = mPager.getCurrentItem();
            if(currentItem != i)
            {
                mPager.clearOnPageChangeListeners();
                mPager.setCurrentItem(currentItem + i, false);
                mPager.addOnPageChangeListener(this);
            }
            break;
        }
    }

    return mPager.dispatchTouchEvent(evt);
}

答案 2 :(得分:0)

如果有人在这个问题上发现并且正在寻找解决方案,我最终使用的是Horizo​​ntalGridView而不是ViewPager ......

Javadoc for HorizontalGridView here

HorizontalGridView Sample