我有一个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);
}}
发布于 2014-01-07 01:42:44
我不完全确定您的意图,因为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); } }
这是取自onPageScrolled方法ViewPager的片段。在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));
}
}根据具体情况,该方法可能会被调用三次。让我们看看有三个视图并从最左边(0)滚动到中间(1)的情况。如果我们处于过渡过程的一半,那么对于两个视图,Math.abs(Math.abs(position) - 1)都将是0.5。这样,我们对两种观点都会采用50%的不透明度。
https://stackoverflow.com/questions/20962245
复制相似问题