实际上我不知道它是如何正确调用的 - overlay,parallax或slideUP,无论如何,我有一个名为“cafe details”的Activity,它提供了一个带有标题信息的Container(LinearLayout)(名称,最低价格,交货时间分钟)等)包含带有信息(菜单和菜肴)的ExpandableListView的其他容器(ViewPager)以及我想要做的就是在将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);
}
}
});
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的对象。 需要你的帮助和新想法。问候。
答案 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:40或this blog post。