此篇为ViewPager2的拓展篇,具体可查看ViewPager2的使用

ViewPager2自定义动画的核心是使用PageTransformer来实现,他是ViewPager2中的一个接口

原理

要显示非默认屏幕滑动动画,请实现 ViewPager2.PageTransformer 接口并将其提供给 ViewPager2 对象。该接口只会公开一个方法 transformPage()。在屏幕切换的每个点,系统会针对每个可见页面(通常只有一个可见页面)和刚刚离开屏幕的相邻页面调用此方法。 例如,如果第 3 页可见且用户拖向第 4 页,则在手势的每个步骤,会针对第 2 页、第 3 页和第 4 页调用 transformPage()。

然后在您的 transformPage() 实现中,您可以根据页面在屏幕上的位置确定需要切换哪些页面,从而创建自定义滑动动画。页面位置取自 transformPage() 方法的 position 参数。

position 参数表示指定页面相对于屏幕中心的位置。 此参数是一个动态属性,会随着用户滚动浏览一系列页面而变化。当页面填满整个屏幕时,其位置值为 0。 当页面刚刚离开屏幕右侧时,其位置值为 1。如果用户在第一页和第二页之间滚动到一半,则第一页的位置为 -0.5,第二页的位置为 0.5。根据页面在屏幕上的位置,您可以使用 setAlpha()、setTranslationX() 或 setScaleY() 之类的方法设置页面属性,从而创建自定义滑动动画。

例:创建页面缩小动画,命名为ZoomOutPageTransformer

public class ZoomOutPageTransformer implements ViewPager2.PageTransformer {private static final float MIN_SCALE = 0.85f;private static final float MIN_ALPHA = 0.5f;public void transformPage(View view, float position) {int pageWidth = view.getWidth();int pageHeight = view.getHeight();if (position < -1) { // [-Infinity,-1)// This page is way off-screen to the left.view.setAlpha(0f);} else if (position <= 1) { // [-1,1]// Modify the default slide transition to shrink the page as wellfloat 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(0f);}}
}

调用:

ViewPager2 mPager = findViewById(R.id.pager);
...
mPager.setPageTransformer(new ZoomOutPageTransformer());

效果图(录制来自谷歌官网)

在深度动画期间,默认动画(屏幕滑动)仍然会发生,因此您必须使用负 X 平移来抵消屏幕滑动。 例如:

view.setTranslationX(-1 * view.getWidth() * position);

以下示例展示了如何抵消可运行的页面转换器中的默认屏幕滑动动画:

public class DepthPageTransformer implements ViewPager2.PageTransformer {private static final float MIN_SCALE = 0.75f;public void transformPage(View view, float position) {int pageWidth = view.getWidth();if (position < -1) { // [-Infinity,-1)// This page is way off-screen to the left.view.setAlpha(0f);} else if (position <= 0) { // [-1,0]// Use the default slide transition when moving to the left pageview.setAlpha(1f);view.setTranslationX(0f);view.setScaleX(1f);view.setScaleY(1f);} else if (position <= 1) { // (0,1]// Fade the page out.view.setAlpha(1 - position);// Counteract the default slide transitionview.setTranslationX(pageWidth * -position);// Scale the page down (between MIN_SCALE and 1)float scaleFactor = MIN_SCALE+ (1 - MIN_SCALE) * (1 - Math.abs(position));view.setScaleX(scaleFactor);view.setScaleY(scaleFactor);} else { // (1,+Infinity]// This page is way off-screen to the right.view.setAlpha(0f);}}
}

效果图(录制来自谷歌官网)


关注我的公众号(不是技术号),让你的职业发展除技术外,多一种可能

ViewPager2添加自定义动画相关推荐

  1. MBProgressHud添加自定义动画

    在使用自定义view时,若直接使用,如下 MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud ...

  2. iOS添加自定义转场动画和交互动画(一)

    准备写两篇,第一篇介绍下转场动画,第二篇介绍下我封装的一个转场动画的库,可以很简便的给VC之间的转变加上自定义动画. iOS场景对应的类是ViewController,基本上一个场景对应一个VC,从一 ...

  3. 百度地图添加自定义图标标注以及自定义动画效果

    百度地图添加自定义图标标注以及自定义动画效果 1.添加自定义图标标注 2.添加自定义动画效果 2.1.标注对象marker的构成 2.2.自定义动画效果实现过程 2.3.最终实现效果 上次写的是添加自 ...

  4. [Android]Fragment自定义动画、动画监听以及兼容性包使用

    Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...

  5. 财物机器人英文ppt演讲课件_“如何恰当使用课件动画”

    每晚21:30 分享教师干货 记得当大姜老师还是一名稚嫩的大一新生时,由于小时候家里管的比较严,几乎没什么碰电脑的机会. 即便有了难得的机会,也都用来打游戏了...... 直到上了大学,需要做各种的汇 ...

  6. PowerPoint ppt 触发器 自定义动画 视频 音频 播放 停止

    PowerPoint ppt 触发器 自定义动画 视频 音频 播放 停止 ppt 中添加视频或者音频后,总是希望可以自由控制播放,然后配合讲解,实现较好的演示效果 那么这需要用到触发器(直接用播放控件 ...

  7. 中学计算机竞赛教程,全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径...

    <全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径>由会员分享,可在线阅读,更多相关<全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自 ...

  8. Android 动画与过渡

    (一) 动画 JetpackCompose提供了强大且可扩展的API,可以轻松地在应用程序的UI中实现各种动画.下面描述了如何使用这些API以及根据动画场景使用哪些API. 动画在现代移动应用程序中至 ...

  9. Android 动画和过渡

    Android 动画和过渡 (一) 动画 JetpackCompose提供了强大且可扩展的API,可以轻松地在应用程序的UI中实现各种动画.下面描述了如何使用这些API以及根据动画场景使用哪些API. ...

最新文章

  1. 双程动态规划 nyoj61
  2. WCF进阶:为每个操作附加身份信息
  3. 开发Activex控件安全
  4. Eclipse安装Android开发环境
  5. LINUX系统管理员技术(Admin)-------第二天
  6. 如何停止一个正在运行的java线程
  7. sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南
  8. 卷积神经网络(基础篇)
  9. 二分排序java实现
  10. Apache Sentry 第一弹:Server启动、连接Hue、分组详解
  11. oracle 导出写入文件失败怎么办,编辑dmp文件解决导入导出问题(oracle 922错误 ,缺少或无效选项)...
  12. InputService
  13. Mybatis快速入门并实现CRUD操作
  14. tensorflow中的tf.get_variable
  15. QCustomplot 实现鼠标追踪定位线以及坐标
  16. 怎么压缩PPT,这一招就可以搞定
  17. linux SFTP用户创建 不允许用户登录,并且连接只允许在制定的目录下进行操作
  18. 记录性能测试脚本开发的过程
  19. 【荐】JS实现类似星球仿flash效果的动态菜单
  20. 如何为谷歌浏览器启用暗模式

热门文章

  1. The Open Group 开放流程自动化论坛 总监Ed Harrington 访谈录
  2. ArcGis系列-java调用GP分析
  3. 基于环视的车位线检测
  4. 计算机应用基础20秋在线作业,东师范《计算机应用基础》20秋在线作业1-4
  5. DGL v0.7正式发布
  6. 自己开发的锂电池电量显示芯片
  7. Edge 浏览器开发 JavaScript 脚本
  8. 好脾气坏脾气,职场上谁走的更远?
  9. 七牛云自定义域名配置阿里云SSL证书
  10. 西门子 SCL 语言 模拟量转换小例程