文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android动画全篇系列(十二)——ViewPager滑动动画

2022-06-06 13:03

关注

文章目录一、前言二、实现1、参数的介绍2、实现三、ViewPager2四、小结 一、前言

ViewPager的作用很多,一般会结合Fragment来构成能左右滑动的视图结构。ViewPager还能够撸成一个Banner轮播图,只需要自定义一个PageAdapter即可。

当我们将ViewPager与Fragment相结合,我们不需要太多花里胡哨的滑动效果,简单的左右滑动就能够满足我们的要求。

而ViewPager运用于轮播图,或者其他类似的滑动展示的效果时,我们不拘泥于普通的滑动效果,非得实现一些卓尔不群的效果。
效果

二、实现 1、参数的介绍

我们只需简单的调用

viewPager.setPageTransformer(boolean,PageTransformer)
方法即可,但是真正的实现——PageTransformer才是最重要的。

PageTransformer是一个接口,系统没有任何的其实现类,我们要自定义ViewPager的滑动动画,必须借助该接口。

class MyPagerTransformer : ViewPager.PageTransformer {
	override fun transformPage(page: View, position: Float) {
	}
}

我们看到这个接口只有一个方法,待我们翻翻源码,看看其方法暴露给我们的属性都代表什么(这里就不贴源码了,因为并不是讲解源码,而是着重讲解使用):

page 就是参与滑动的View,以上面的GIF图作为例子:假设现在是在 page-1 界面,那么page就是page-1与其相邻的View,又因为其左边是没有View的,所以page就是page-1page-2
假设现在是page-2界面,那么page就是page-1page-2page-3.

为什么一个page可以代表两个或者三个page?因为其暴露的方法在一个for循环里面,这个循环的范围就是显示的page及其相邻的page。

position 就是指代坐标了,但是这个坐标是相对的。
任何显示在正中间的page的position == 0,左边是-1,右边是+1。 position会根据滑动的距离而产生变化,向左减小,向右增大。再举个例子:
假设现在是page-2,那么page-2的position == 0,向左滑动,划至page-3,那么page-2的position会从0到-1,而page-3的position会从1到0,page-1的position会从-1到-2。
假设现在还是page-2,向右滑动,划至page-1,那么page-2的position会从0到1,而page-3的position会从1到2,page-1的position会从-1到0。 2、实现

知道了这些参数的意义,那我们就可以根据position的变化,来对page进行相应的变化,你可以使得page缩放、透明或者是旋转。

我们先从最简单的,也比较直观的缩放开始:

class MyPagerTransformer : ViewPager.PageTransformer {
	//最小透明度
    private val MIN_SCALE = 0.8f
    override fun transformPage(page: View, position: Float) {
        page.apply {
            when {
                position  { 
                	//向左滑动时,左边的page,由于看不见,所以设不设置都无所谓
                }
                position  { 
                	//[-1,1]
                	//向左滑动时,代表中间的page和右边的page
                	//向右滑动时,代表中间的page和左边的page
                    val scaleValue = Math.max(MIN_SCALE,1 - Math.abs(position))
					scaleX = scaleValue
                    scaleY = scaleValue
                }
                else -> { 
                	// position>1
                    // 向右滑动时,右边的page,还是看不见,所以可以不用设置
                }
            }
        }
    }
}

然后给ViewPager设置上:

viewPager.setPageTransformer(false, MyPagerTransformer())

再看看效果,如本章开头的GIF一样的缩放效果就完成了,再配合透明度,就可以完成一模一样的效果。

三、ViewPager2

ViewPager2作为谷歌新推出的控件,看名字是有意取代ViewPagerViewPager2的原理其实是借助了RecyclerView,其过多的使用和实现我就不讲了。

因为今天的主题是ViewPager的滑动动画,那么这个ViewPager2的滑动动画我们怎么实现呢?

其实这一点谷歌非常的人性化,在ViewPager2里面也有一个PageTransformer的接口,其接口里面的方法也是和ViewPager中一模一样,所以ViewPager2的滑动动画的实现和ViewPager并无差别,你仅仅只需要修改以下继承的类即可:

class MyPagerTransformer : ViewPager2.PageTransformer{
	//方法名字和参数都不需要修改,内容也不需要修改
	... ...
}

然后再调用用

viewPager2.setPageTransformer(ViewPager2.PageTransformer)
即可。

四、小结

其实自定义ViewPager滑动动画的关键点,就在于你如何利用position这个参数,来改变page的样式。这个时候就是要展露出你的功底了……


作者:catzifeng


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯