滚动

时间:2015-05-22 12:42:34

标签: android android-listview scroll overlay

实际上我不知道它是如何正确调用的 - overlay,parallax或slideUP,无论如何,我有一个名为“cafe details”的Activity,它提供了一个带有标题信息的Container(LinearLayout)(名称,最低价格,交货时间分钟)等)包含带有信息(菜单和菜肴)的ExpandableListView的其他容器(ViewPager)以及我想要做的就是在将listview滚动到scpecific Y位置以覆盖(或覆盖)标题信息时向上滑动我的Viewpager。

MyPic

类似的效果(但我不需要使用的视差)看起来像这样

Similar effect

我可以检测用户何时向下滚动列表视图但是如何使用ViewPager移动容器以覆盖其他容器?请给我一些想法,问候。

UPD 我已经尝试了很多方法来实现它,但遗憾的是它们都不适合。所以现在我来到下一个变体 - 向ListView添加滚动侦听器,计算视图的scrollY位置,然后基于通过调用setTranslationY()移动y轴上的viewpager; 这是一些代码

1)ViewPager的片段

    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {

        }

        @Override
        public void onScroll(AbsListView absListView, int i, int i1, int i2) {
            if (getActivity() != null) {
                ((MainActivity) getActivity()).resizePagerContainer(absListView);
            }
        }
    });

2)MainActivity

//object fields

int previousPos; 
private float minTranslation;
private float minHeight;

<--------somewhere in onCreate

minTranslation = - (llVendorDescHeaders.getMeasuredHeight()+llVendorDescNote.getMeasuredHeight());
//llVendorDescHeaders is linearLayout with headers that should be hidden
//lVendorDescNote is a textView on green background;

minHeight = llVendorDescriptionPagerContainer.getMeasuredHeight();
//llVendorDescriptionPagerContainer is a container which contains ViewPager
--------->

public void resizePagerContainer(AbsListView absListView){

    final int scrollY = getScrollY(absListView);
    if (scrollY != previousPos) {
        final float translationY = Math.max(-scrollY, minTranslation);

        llVendorDescriptionPagerContainer.setTranslationY(translationY);

        previousPos = scrollY;
    }
}

private int getScrollY(AbsListView view) {
    View child = view.getChildAt(0);
    if (child == null) {
        return 0;
    }

    int firstVisiblePosition = view.getFirstVisiblePosition();
    int top = child.getTop();

    return -top + firstVisiblePosition * child.getHeight() ;
}

不幸的是,这个简单的解决方案有一个问题 - 当缓慢滚动时,它正在闪烁和抽搐(我不知道如何正确调用它)。所以改为setTranslationY()我使用了objectAnimator:

public void resizePagerContainer(AbsListView absListView){
    .............

    ObjectAnimator moveAnim = ObjectAnimator.ofFloat(llVendorDescriptionPagerContainer, "translationY", translationY);
    moveAnim.start();
   ..............
}

我不喜欢这个解决方案,因为1)无论如何它会延迟调整viewpager,而不是立即调整2)我不认为每次滚动listView时都会创建很多ObjectAnimator的对象。 需要你的帮助和新想法。问候。

2 个答案:

答案 0 :(得分:2)

我假设你正在滚动顶部标题(ImageView是标题的子节点),基于ListView / ScrollView的scrollY,如下所示:

float translationY = Math.max(-scrollY, mMinHeaderTranslation);
mHeader.setTranslationY(translationY);
mTopImage.setTranslationY(-translationY / 3); // For parallax effect

如果你想将标题/图像粘贴到某个尺寸并继续滚动而不再移动它,那么你可以改变mMinHeaderTranslation的值来达到这个效果。

//change this value to increase the dimension of header stuck on the top
int tabHeight = getResources().getDimensionPixelSize(R.dimen.tab_height); 

mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.header_height);
mMinHeaderTranslation = -mHeaderHeight + tabHeight;

上面的代码片段是参考我的演示,但我认为它仍然适合你。

如果您有兴趣,可以查看我的演示 https://github.com/boxme/ParallaxHeaderViewPager

答案 1 :(得分:1)

您是否尝试过这个新的Android设计支持库中的CoordinatorLayout?它看起来像你需要的。 Check this video from 3:40this blog post