我有一个显示 3 个不同页面的 ViewPager。我想使用 Google 示例中的 ZoomOutPageTransformer 为寻呼机设置动画:
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
private static float MIN_SCALE = 0.85f;
private static float MIN_ALPHA = 0.5f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
int pageOffset = 1; //one page offset
if (position < -1) { // [-Infinity,-2)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
if (position < 0) {
view.setTranslationX(horzMargin - vertMargin / 2);
} else {
view.setTranslationX(-horzMargin + vertMargin / 2);
}
// Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
// Fade the page relative to its size.
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
我添加了变量“pageOffset”。我现在想要的是动画不是第一页,而是第二页(居中)。所以我必须将整个动画向右移动一步。然后居中的页面将比其他页面“更大”并且更可见。
但是我无法做到这一点。我试图将位置更改为 position+offset
但没有成功。我应该在此代码段中做什么才能获得我想要的结果?
编辑:我认为这行得通 - 但是,它行不通:
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
int pageOffset = 1; //one page offset
if (position < -1 - pageOffset) { // [-Infinity,-2)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position - pageOffset <= 1) { // [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position - pageOffset));
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
if (position - pageOffset < 0) {
view.setTranslationX(horzMargin - vertMargin / 2);
} else {
view.setTranslationX(-horzMargin + vertMargin / 2);
}
// Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
// Fade the page relative to its size.
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
最佳答案
我不能完全确定您的 Intent ,因为 pageOffset
设置为 1
并且从未更新过。也就是说,也许对我对 PageTransformer
的理解的解释会有所启发:
if (mPageTransformer != null) { final int scrollX = getScrollX(); final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); final LayoutParams lp = (LayoutParams) child.getLayoutParams(); if (lp.isDecor) continue; final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth(); mPageTransformer.transformPage(child, transformPos); } }
这是取自 ViewPager
的 onPageScrolled
方法的 fragment .在 transformPage
方法中,您应该使用 position
参数来确定要应用的动画,如提供的 ZoomOutPageTransformer 所示:
if (position < -1) // This view is leftward beyond visibility.
else if (position <= 1) // This is our center view being scrolled into visibility.
else // This view is rightward beyond visibility.
再举个例子:
@Override
public void transformPage(View page, float position) {
if (position >= 0) {
page.setAlpha(Math.abs(Math.abs(position) - 1));
}
}
根据情况,此方法最多可能会被调用 3 次。让我们看一下我们有三个 View 并从最左边 (0) 滚动到中间 (1) 的情况。如果我们在转换过程中进行到一半,Math.abs(Math.abs(position) - 1)
两个 View 的值为 0.5 ||±0.5| - 1| = 0.5。这样,我们将对两个 View 应用 50% 的不透明度。
关于android - 用于处理 "centered"页面的 PageTransformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962245/