【问题标题】:ListView overlay another layout when scroll滚动时 ListView 覆盖另一个布局
【发布时间】:2015-05-22 12:42:34
【问题描述】:

实际上我不知道它是如何正确调用的 - 叠加、视差或滑动,无论如何,我有一个名为“cafe details”的 Activity,它显示一个带有标题信息(名称、最低价格、交货时间 min)的 Container(LinearLayout)等)和其他容器(ViewPager),其中包含带有某些信息(菜单和菜肴)的 ExpandableListView,我要做的就是在将列表视图滚动到特定 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);
            }
        }
    });

2) 主活动

//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() ;
}

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

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

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

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

【问题讨论】:

    标签: android android-listview scroll overlay


    【解决方案1】:

    我假设你是根据ListView/ScrollView的scrollY来滚动top header(ImageView是header的一个child),如下图:

    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;
    

    上面的代码 sn-ps 参考了我的演示,但我认为它对你来说仍然足够通用。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复,不知google最近在android支持库中发布了新花样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多