我正在尝试实现像here这样的ParallaxHeaderViewPager。但是使用KenBurnsSupportView
和ImageView
作为标题,我使用了包含FrameLayout
的{{1}}。我的问题是,如果我尝试在标题上使用垂直滚动,则事件被消耗但没有任何反应。我只能在页眉(ViewPager
)上水平滚动,页面正确更改。但这不是我想要完成的。我希望如果我在标题上垂直滚动事件以被识别为ViewPager
滚动,并且我在水平滚动(在标题上)作为ViewPager滚动。滚动在标题中未使用的区域上正常运行。即在我有4个Listviews的标题下,我可以垂直和水平滚动。我目前使用的布局类似于以下代码段:
ListView
我尝试将<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/header_height" >
<FrameLayout
android:id="@+id/news_pager_content_area"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@color/white"
/>
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="48dip"
android:layout_gravity="bottom"
android:background="@android:color/transparent" />
</FrameLayout>
和Listviews
子类化,以拦截和处理触摸事件,但似乎Android文档中记录的默认行为在我的示例中不适用。谢谢你的帮助。
答案 0 :(得分:1)
我在Stackoverflow上尝试了类似主题的所有答案并再次查看Android文档时解决了我的问题。我为上面的Layout文件的根容器创建了一个自定义FrameLayout。我重写了dispatchTouchEvent方法。
public boolean dispatchTouchEvent(MotionEvent ev)
{
switch (ev.Action)
{
case MotionEventActions.Down:
_xDistance = _yDistance = 0f;
_lastX = ev.GetX();
_lastY = ev.GetY();
_startY = _lastY;
_isFirstTime = true;
_downEvent = MotionEvent.obtain(ev);
break;
case MotionEventActions.Move:
float curX = ev.GetX();
float curY = ev.GetY();
_xDistance += Math.abs(curX - _lastX);
_yDistance += Math.abs(curY - _lastY);
_lastX = curX;
_lastY = curY;
float yDeltatTotal = curY - _startY;
if (_yDistance > _xDistance && Math.abs(yDeltatTotal) > _touchSlop)
{
if (_isFirstTime)
{
_isFirstTime = false;
return childView.dispatchTouchEvent(_downEvent);
}
return childView.dispatchTouchEvent(ev);
}
}
return super.DispatchTouchEvent(ev);
}
作为ChildView的地方我从上面的布局中设置了具有id = pager的ViewPager。为了避免指针索引超出范围Exception,我在这个link的第一条评论中使用了Dmitry Zaitsev指定的获取方法。