我已经实现了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中的触摸事件传播到相应的片段?
答案 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)
如果有人在这个问题上发现并且正在寻找解决方案,我最终使用的是HorizontalGridView而不是ViewPager ......