Android ViewPager ZoomOut 动画

Mr *_*lot 0 android android-animation android-viewpager

我有一个如下所示的 ViewPager:

在此处输入图片说明

当您滑动并仅保持中心视图的大小时,我需要侧面的预览以缩小,如下所示:

在此处输入图片说明

我已经尝试了一些示例,ViewPager.PageTransformer()但这些示例总是带有淡入淡出动画(我不需要)并且不显示预览(我需要)。

ash*_*rov 6

    final int paddingPx = 300;
    final float MIN_SCALE = 0.8f;
    final float MAX_SCALE = 1f;

    viewPager.setClipToPadding(false);
    viewPager.setPadding(paddingPx, 0, paddingPx, 0);
    viewPager.setPageTransformer(false, transformer);
Run Code Online (Sandbox Code Playgroud)

这使得页面小于 viewpager 宽度:

在此处输入图片说明

这是我的变压器:

    PageTransformer transformer = new PageTransformer() {
        @Override
        public void transformPage(View page, float position) {
            float pagerWidthPx = ((ViewPager) page.getParent()).getWidth();
            float pageWidthPx = pagerWidthPx - 2 * paddingPx;

            float maxVisiblePages = pagerWidthPx / pageWidthPx;
            float center = maxVisiblePages / 2f;

            float scale;
            if (position + 0.5f < center - 0.5f || position > center) {
                scale = MIN_SCALE;
            } else {
                float coef;
                if (position + 0.5f < center) {
                    coef = (position + 1 - center) / 0.5f;
                } else {
                    coef = (center - position) / 0.5f;
                }
                scale = coef * (MAX_SCALE - MIN_SCALE) + MIN_SCALE;
            }
            page.setScaleX(scale);
            page.setScaleY(scale);
        }
    };
Run Code Online (Sandbox Code Playgroud)

难点position在于transformPage方法的参数。当页面填充 viewpagers 宽度时,此参数从 0 更改为 1。但是当页面较小时,此参数很棘手。

position是视图左侧的值。页面宽度等于 1。position当页面左侧位于 viewpager 的左侧时,页面宽度等于0。所以position可以大于 1,取决于页面宽度。 在此处输入图片说明

首先,您需要找到viewpagers 中心(相对于position参数)。如果页面从中心向左或向右移动,则缩小页面。在我的实现中,我缩小了距中心半页距离的视图。

这是结果:

在此处输入图片说明 在此处输入图片说明

可以通过 控制页面宽度padding

可以通过tviewPager.setPageMargin(value)方法添加页面之间的额外边距。

  • `position` 变量是最难的部分,我也没有找到文档。所以我在我的页面视图中创建了`TextView`。在 `transformPage` 方法中,我将 `position` 值写入 `TextView`。之后,当我滚动 viewpager 时,我可以看到每个页面的 `position` 变量如何变化。然后是简单的部分:我找到屏幕的中心。之后,我只编写缩放视图的代码,这取决于页面中心与屏幕中心的接近程度。 (2认同)