ViewPager页面滑动效果,自定义PageTransformer实现想要的变换效果

开发 前端
创建一个类并实现PageTransformer接口,重写transformPage(View page, float position)​方法。根据position​参数的值来更改page视图的属性,如透明度、大小、旋转角度等,以达到自定义的滑动效果。

PageTransformer是ViewPager内部定义的一个接口,用于控制ViewPager中页面(item view)的滑动效果。PageTransformer可以在页面滑动过程中自定义页面的变换效果,如透明度渐变、缩放、旋转等。

接口定义

PageTransformer接口定义了一个方法transformPage(View page, float position)

  • page:表示当前正在滑动的页面视图。
  • position:表示页面相对于当前中心页面的位置,值是一个浮点数,范围根据滑动方向有所不同。例如,当向左滑动时,当前页面的position值变化为[0~-1],右边页面的position值变化为[1~0];向右滑动时,当前页面的position值变化为[0~1],左边页面的position值变化为[-1~0]。

常见使用场景

  • 「透明度渐变」:在页面滑动过程中改变页面的透明度,实现淡入淡出效果。
  • 「缩放」:在页面滑动过程中改变页面的大小,实现缩放效果。
  • 「旋转」:在页面滑动过程中改变页面的旋转角度,实现旋转效果。

实现方式

创建一个类并实现PageTransformer接口,重写transformPage(View page, float position)方法。根据position参数的值来更改page视图的属性,如透明度、大小、旋转角度等,以达到自定义的滑动效果。

示例代码

透明渐变效果

public class AlphaPageTransformer implements ViewPager.PageTransformer {
    @Override
    public void transformPage(@NonNull View page, float position) {
        page.setAlpha(1 - Math.abs(position));
    }
}

在transformPage方法中,根据position的绝对值来设置页面的透明度,使页面在滑动过程中透明度发生变化。

透明旋转翻页效果

public class RotatePageTransformer implements ViewPager.PageTransformer {
    @Override
    public void transformPage(@NonNull View page, float position) {
        int pagerWidth = mViewPager.getWidth();
        float horizontalOffsetBase = (pagerWidth - pagerWidth * 1.2f) / 2 / offscreenPageLimit + 45;

        if (position >= offscreenPageLimit || position <= -1) {
            page.setVisibility(View.GONE);
        } else {
            page.setVisibility(View.VISIBLE);
        }

        if (position >= 0) {
            float translationX = (horizontalOffsetBase - page.getWidth()) * position;
            page.setTranslationX(translationX);
        }
        if (position > -1 && position < 0) {
            float rotation = position * 30;
            page.setRotation(rotation);
            page.setAlpha((position * position * position + 1));
        } else if (position > offscreenPageLimit - 1) {
            page.setAlpha((float) (1 - position + Math.floor(position)));
        } else {
            page.setRotation(0);
            page.setAlpha(1);
        }
        if (position == 0) {
            page.setScaleX(1.2f);
            page.setScaleY(1.2f);
        } else {
            float scaleFactor = Math.min(1.2f - position * 0.1f, 1.2f);
            page.setScaleX(scaleFactor);
            page.setScaleY(scaleFactor);
        }

        ViewCompat.setElevation(page, (offscreenPageLimit - position) * 5);
    }
}

调用ViewPager的setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer)方法,设置实现的PageTransformer效果。

ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setPageTransformer(true, new RotatePageTransformer());

图片图片

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2013-01-06 10:43:54

Android开发View特效

2013-03-28 10:58:30

自定义Android界android

2012-06-14 15:49:59

Slider

2010-04-28 11:14:20

Windows 7桌面

2009-09-03 16:50:35

C#鼠标形状

2021-09-14 15:13:18

鸿蒙HarmonyOS应用

2017-04-21 14:27:21

Android控件QQ未读消息

2011-02-17 10:54:59

CSS3变换 简单快捷

2009-09-23 17:19:19

jQuery页面渐显效

2013-01-14 17:18:43

Android开发TextView跑马灯效果

2010-01-13 16:52:03

VB.NET导出数据

2012-06-01 10:12:39

2011-05-31 09:23:58

Android Activity

2023-10-11 08:14:43

iPhoneTabs标签页

2024-05-11 08:25:43

自定义分隔线背景效果

2015-01-22 16:04:06

iPhone

2009-09-07 22:00:15

LINQ自定义

2011-07-08 10:15:15

IPhone 动画

2015-02-12 15:33:43

微信SDK

2022-04-01 15:59:22

SQLPostgreSQL审计
点赞
收藏

51CTO技术栈公众号