首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于处理“居中”页的PageTransformer

用于处理“居中”页的PageTransformer
EN

Stack Overflow用户
提问于 2014-01-07 01:09:47
回答 1查看 3.2K关注 0票数 3

我有一个ViewPager,它显示了三个不同的页面。我想通过使用Google示例中的ZoomOutPageTransformer来动画寻呼机:

代码语言:javascript
复制
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,但没有成功。在这个片段中我应该怎么做才能得到我想要的结果?

编辑:我认为这会奏效--但是,它没有:

代码语言:javascript
复制
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);
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中所示:

代码语言:javascript
复制
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.

另一个例子是:

代码语言:javascript
复制
    @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%的不透明度。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20962245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档