是否可以在ViewPager中为不同的片段设置不同的PageTransformer?
当用户使用n个片段在ViewPager的(0,1)和(n-1,n)个片段之间滑动时,我想使用ZoomOutPageTransformer,并对所有其他情况使用默认转换。
我尝试了什么:
使用mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { ... })
检测当前页面并在此处应用不同的转换。但是,例如,如果用户在第一页上 - 如何设置ZoomOutPageTransformer仅适用于他将向左滑动(0页)并在动画开始之前执行此操作的情况?
答案 0 :(得分:1)
我有一个不太相似的要求,其中默认情况下我将深度页变换器应用到我的所有页面,然后点击按钮我将其更改为垂直页面变换器然后返回到深度页面。 (很奇怪,但就是这样)
我做了以下事情:
viewPager.setPageTransformer(true, new DepthPageTransformer());
。viewPager.setPageTransformer(true, new VerticalPageTransformer());
。现在,为了顺利运行,我们必须使用handler
以便稍后更改页面以确保VerticalPager生效。我通过致电viewPager.setCurrentPosition(viewPager.getCurrentItem() + 1)
viewPager.setPageTransformer(true, new DepthPageTransformer());
内再次将其更改回handler
,以确保在完成垂直动画后完成。注意 - 我还访问了ViewPager的滚动条来实现上述目标,以便为页面更改定义自己的速度。
如果这有意义,请告诉我,因为您需要根据页码来完成。如果有,我将分享我的代码。 :)
答案 1 :(得分:0)
尽管使用 mViewPager.setOnPageChangeListener ,但具有不同动画的单个PageTransformer 可以提供帮助。
请看这里的第一段,
http://developer.android.com/training/animation/screen-slide.html#pagetransformer
答案 2 :(得分:0)
这已经很老了,但希望对某人为时不晚
第1步:
创建自ViewPager
开始的自定义ViewPager
。
第2步:
确定哪些Fragment
位置(ViewPager
页整数)需要具有唯一的PageTransformer
。然后将这些索引添加到自定义ViewPager
内的列表中。
第3步:
覆盖onPageScrolled(int position, float offset, int offsetPixels)
:
position
是否在索引列表中,如果是,则必须创建一个自定义PageTransformer
对象;然后使用ViewPager
setPageTransformer()
来更改页面转换。PageTransformer
(或者,您也可以根据需要设置另一个自定义PageTransformer
对象。代码
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
PageTransformer mDepthPageTransformer = new PageTransformer() {
private static final float MIN_SCALE = 0.75f;
public void transformPage(@NonNull View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0f);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1f);
view.setTranslationX(0f);
view.setScaleX(1f);
view.setScaleY(1f);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0f);
}
}
};
PageTransformer mDefaultPageTransformer = new PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
}
};
@Override
protected void onPageScrolled(int position, float offset, int offsetPixels) {
List<Integer> pos = new ArrayList<>();
pos.add(0);
pos.add(n - 1); // n is the no. of pages as in the question
if (pos.contains(position)) {
this.setPageTransformer(true, mDepthPageTransformer);
} else {
this.setPageTransformer(true, mDefaultPageTransformer);
}
super.onPageScrolled(position, offset, offsetPixels);
}
}
文档
注意:在我的示例中使用的mDepthPageTransformer来自上述文档。