【发布时间】: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