滚动时ListView覆盖另一个布局

whi*_*key 8 android scroll overlay android-listview

实际上我不知道它是如何正确调用 - 覆盖,视差或滑动,无论如何,我有一个名为"咖啡馆细节"的活动,它提供了一个带有标题信息的容器(LinearLayout)(名称,最低价格,交货时间最小等)和其他容器(ViewPager)包含一个带有信息(菜单和菜肴)的ExpandableListView,我想要做的就是在将listview滚动到scpecific Y位置以覆盖(或覆盖)标题信息时向上滑动我的Viewpager.

我的照片

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

效果相似

我可以检测用户何时向下滚动列表视图但是如何使用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);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

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() ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    ObjectAnimator moveAnim = ObjectAnimator.ofFloat(llVendorDescriptionPagerContainer, "translationY", translationY);
    moveAnim.start();
   ..............
}
Run Code Online (Sandbox Code Playgroud)

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

Gin*_*as_ 1

您是否尝试过这个新的 Android 设计支持库中的 CoordinatorLayout?看起来这正是您所需要的。查看 3:40 的视频这篇博文