Android ViewPager ZoomOut动画

Android ViewPager ZoomOut动画,android,android-viewpager,android-animation,Android,Android Viewpager,Android Animation,我有一个如下所示的ViewPager: 我需要侧边的预览,以便在您滑动时缩放,并仅保持中心视图的大小,如下所示: 我已经用ViewPager.PageTransformer()尝试了一些示例,但是这些示例总是带有淡入淡出动画(我不需要),并且不显示预览(我需要) 这会使页面小于viewpager宽度: 这是我的变压器: PageTransformer transformer = new PageTransformer() { @Override pu

我有一个如下所示的ViewPager:

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

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

这会使页面小于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);
        }
    };
PageTransformer transformer=新的PageTransformer(){
@凌驾
公共页面(查看页面、浮动位置){
float pagerWidthPx=((ViewPager)page.getParent()).getWidth();
浮动页面宽度px=页面宽度px-2*填充px;
float maxVisiblePages=pagerWidthPx/pageWidthPx;
浮动中心=最大可视页面数/2f;
浮标;
如果(位置+0.5f<中心-0.5f | |位置>中心){
刻度=最小刻度;
}否则{
浮动系数;
如果(位置+0.5f<中心){
coef=(位置+1-中心)/0.5f;
}否则{
coef=(中心位置)/0.5f;
}
比例=系数*(最大比例-最小比例)+最小比例;
}
第页设置刻度(刻度);
第页设置刻度(刻度);
}
};
这方面的难点是
position
方法的
transformPage
参数。当页面填充viewpagers width时,此参数从0更改为1。但是当页面变小时,这个参数是很棘手的

位置
是视图左侧的值。页面宽度等于1<当页面左侧位于viewpager的左侧时,代码>位置等于0。因此,
位置
可以大于1,具体取决于页面宽度。

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

结果如下:

页面宽度可以通过
填充
来控制


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

这100%解决了我的问题,感谢您的详细解释!我不得不问,你是如何计算出转换所需的数学的?我没有找到任何官方文档来解释如何正确使用
transformPage
方法中的所有变量(比例、宽度、位置等)。
position
变量是最难的部分,我也没有找到文档。因此,我将
TextView
创建到我的页面视图中。在
transformPage
方法中,我将
position
值写入
TextView
。之后,当我滚动viewpager时,我可以看到每个页面的
position
变量是如何变化的。然后是简单的部分:我找到屏幕的中心。之后,我只编写代码,根据页面中心到屏幕中心的距离来缩放视图。
    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);
        }
    };