Android Viewpager作为ParallaxHeader示例中的标题不会按预期滚动

时间:2014-12-17 11:46:03

标签: android listview scroll android-viewpager touch-event

我正在尝试实现像here这样的ParallaxHeaderViewPager。但是使用KenBurnsSupportViewImageView作为标题,我使用了包含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文档中记录的默认行为在我的示例中不适用。谢谢你的帮助。

1 个答案:

答案 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指定的获取方法。