ViewPager的过渡动画

本文探讨如何在Android中自定义ViewPager的过渡动画,通过分析setPageTransformer()方法及transformPage()参数position的含义,讲解如何实现不同状态的页面动画效果。作者分享了实践中的观察和结论,并鼓励读者尝试实现个性化动画。
摘要由CSDN通过智能技术生成

开篇

作为我的第一篇博客,可能写的时候还有些粗糙,知识点的叙述也不够明确,不过这才是开始,而且每一篇博客都会用心去编写,所写的内容都是自己在学习安卓中的一些发现和见解,基于我的技术水平有限,如有不足的可以留言,有错误的地方也请及时批评指出。

没有前戏,直接上重点

因为是自己的第一篇,也是我第一次写博客,对于各种排版的问题,大家可以忽略,重点是代码和一些重要的说明我都会用粗体标出的。

  1. 关于ViewPager 的基本使用和适配器的创建,这些内容在本文中都没有,在网上有很多资料的,本文重点是在过渡动画

  2. 或者说这篇文章主要是研究ViewPager的一个方法setPageTransformer(),这是在API11,也就是android3.0之后安卓官方给我们提供的一个能够改变ViwePager过渡动画的一个方法,或者说接口。

  3. 先看一下源码,本人英语水平有限,大家自行理解阅读吧,怕误导各位了。
    /**
         * Set a {@link PageTransformer} that will be called for each attached page whenever
         * the scroll position is changed. This allows the application to apply custom property
         * transformations to each page, overriding the default sliding look and feel.
         *
         * <p><em>Note:</em> Prior to Android 3.0 the property animation APIs did not exist.
         * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect.</p>
         *
         * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
         *                            to be drawn from last to first instead of first to last.
         * @param transformer PageTransformer that will modify each page's animation properties
         */
        public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
            if (Build.VERSION.SDK_INT >= 11) {
                final boolean hasTransformer = transformer != null;
                final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
                mPageTransformer = transformer;
                setChildrenDrawingOrderEnabledCompat(hasTransformer);
                if (hasTransformer) {
                    mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
                } else {
                    mDrawingOrder = DRAW_ORDER_DEFAULT;
                }
                if (needsPopulate) populate();
            } 
    

  4. android官方文档上也对于这个方法的使用,感兴趣的可以参考一下。(我记得有,不过刚才找了没找到,丢人啊!)

精华部分

这是我自己经过多次试验之后得到的代码与结论,可以直接看代码,代码中的注释也许会让你对这个方法产生一种感觉,原来改变动画这么简单

vp.setPageTransformer(true, new PageTransformer() {
			@Override
			public void transformPage(View view, float position) {
				float mdistance=0.5f;
				if(position<-1){
					//设置成不可见就可以
					view.setAlpha(0);
				}else if(position<=0){
					//小于零的position所对应的是在屏幕左边的view
					//划入屏幕时position是从-1到0
					//划出屏幕时position是从0到-1
					//执行缩放时,不设置中心点会自动选择view中心
					view.setAlpha(1+position);
					view.setScaleY((position+1)/2+mdistance);

				}else if(position<=1){
					//大于零的position所对应的是在屏幕右边的view
					//划入屏幕的时候position是从1到0
					//划出屏幕的时候position是从0到1
					//执行缩放时,不设置中心点会自动选择view的中心
					view.setAlpha(1-position);
					view.setScaleY((1-position)/2+mdistance);
				}else {
					//设置成不可见就可以
					view.setAlpha(0);    
				}
			}
		});

现在给大家稍微解释一下,ViewPager在调用setPageTransformer()方法后会要求重写一个方法就是transformPage(),其实就是重写ViewPager的一个内部接口里的方法,重要的是方法的参数,第一个是view,可以不管他,重点是第二个position,网上很多资料,官方也给了一下说明,大概的意思就是当处于屏幕正中的时候position是0,当左边的view恰好划出屏幕时是-1,右边的view恰好划入的时候是1。当我读这种解释的时候,完全不理解是什么意思,还有说左右两边各占屏幕一半的时候,左边的是-0.5,右边的是+0.5,不懂之后我就进行了一系列的试验,最终得出了代码中注释部分的结论。

  1. 首先position小于0就是指屏幕左边的view的位置,position大于0就是指屏幕右边的view的位置,小于-1和大于1均可以不用考虑,因为看不见的。

  2. 对于position小于0来说,也就是相对于屏幕左边的view来说有两种情况,一种就是划入屏幕,此时position的变化是从-1到0的,另一种就是划出屏幕,此时position的变化是从0到-1的。这都是指屏幕左边的view。

  3. 对于position大于0来说,也就是相对于屏幕右边的view来说也有两种情况,一种划入时,position变化是从1到0,另一种就是划出时,position变化是从0到1。这里指的是屏幕右边的view。

  4. 当我们了解了position的基本变化了之后就是一尝试实现自己想要的动画效果了,对于小于-1和大于1的情况可以直接设置透明度为0就可以了,官方也是这么写的。当处于-1到0,和0到1之间时,这个时候可以调用view的各种set方法来实现你想要的动画效果,透明度啊,缩放啊,平移啊,旋转啊,都可以,重点的是对于position(位置)的理解。

  5. 对于相对于在屏幕左边的view来说,我们只需要设置划出或者划入时的一种动画方案即可,因为两种情况下position的变化是相对的,但是如果你想得到更复杂的动画效果,比如划入的时候采用缩放的方式进入,划出的时候采用旋转的方式划出,这也是可以的,这需要你对position的变化进行判断,来决定采用什么样的过场动画,通常情况下,我们只需要写一种就可以了。

  6. 对于动画的实现方案,这就可以根据个人喜好取设置了,剩下的都是逻辑问题,大家可以自行去尝试实现一下,其实也挺好玩的,附上代码中所实现的效果,真的挺简单的。(这个怎么插入动画效果啊?)好吧,等我之后的文章在上图吧,现在有点研究不明白这个博客怎么上效果图了,那这篇文章到这就结束了。

总结一下吧!

先说一下在我最近使用中遇到的问题,昨天在使用viewpager+fragment的时候遇到了,发现在更改了过渡动画了之后在左右滑动的时候,如果不滑动到屏幕的边界的话,fragment所对应的视图不会充满屏幕的,会保持在手指离开屏幕时view的状态,但在功能上没有问题,不知道是哪里出了毛病。

作为我的第一文章,写得有点乱,也没有什么内容,至少对于一个方法中一个参数的变化过程的分析,不过这确实是我经过独立的实践之后发现的结论(油然而生的成就感),希望能够对看这文章的能有所帮助,同时也欢迎批评指正,多多交流。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值