开篇
作为我的第一篇博客,可能写的时候还有些粗糙,知识点的叙述也不够明确,不过这才是开始,而且每一篇博客都会用心去编写,所写的内容都是自己在学习安卓中的一些发现和见解,基于我的技术水平有限,如有不足的可以留言,有错误的地方也请及时批评指出。
没有前戏,直接上重点
因为是自己的第一篇,也是我第一次写博客,对于各种排版的问题,大家可以忽略,重点是代码和一些重要的说明我都会用粗体标出的。
关于ViewPager 的基本使用和适配器的创建,这些内容在本文中都没有,在网上有很多资料的,本文重点是在过渡动画
或者说这篇文章主要是研究ViewPager的一个方法setPageTransformer(),这是在API11,也就是android3.0之后安卓官方给我们提供的一个能够改变ViwePager过渡动画的一个方法,或者说接口。
先看一下源码,本人英语水平有限,大家自行理解阅读吧,怕误导各位了。
/** * 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(); }
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,不懂之后我就进行了一系列的试验,最终得出了代码中注释部分的结论。
首先position小于0就是指屏幕左边的view的位置,position大于0就是指屏幕右边的view的位置,小于-1和大于1均可以不用考虑,因为看不见的。
对于position小于0来说,也就是相对于屏幕左边的view来说有两种情况,一种就是划入屏幕,此时position的变化是从-1到0的,另一种就是划出屏幕,此时position的变化是从0到-1的。这都是指屏幕左边的view。
对于position大于0来说,也就是相对于屏幕右边的view来说也有两种情况,一种划入时,position变化是从1到0,另一种就是划出时,position变化是从0到1。这里指的是屏幕右边的view。
当我们了解了position的基本变化了之后就是一尝试实现自己想要的动画效果了,对于小于-1和大于1的情况可以直接设置透明度为0就可以了,官方也是这么写的。当处于-1到0,和0到1之间时,这个时候可以调用view的各种set方法来实现你想要的动画效果,透明度啊,缩放啊,平移啊,旋转啊,都可以,重点的是对于position(位置)的理解。
对于相对于在屏幕左边的view来说,我们只需要设置划出或者划入时的一种动画方案即可,因为两种情况下position的变化是相对的,但是如果你想得到更复杂的动画效果,比如划入的时候采用缩放的方式进入,划出的时候采用旋转的方式划出,这也是可以的,这需要你对position的变化进行判断,来决定采用什么样的过场动画,通常情况下,我们只需要写一种就可以了。
对于动画的实现方案,这就可以根据个人喜好取设置了,剩下的都是逻辑问题,大家可以自行去尝试实现一下,其实也挺好玩的,附上代码中所实现的效果,真的挺简单的。(这个怎么插入动画效果啊?)好吧,等我之后的文章在上图吧,现在有点研究不明白这个博客怎么上效果图了,那这篇文章到这就结束了。
总结一下吧!
先说一下在我最近使用中遇到的问题,昨天在使用viewpager+fragment的时候遇到了,发现在更改了过渡动画了之后在左右滑动的时候,如果不滑动到屏幕的边界的话,fragment所对应的视图不会充满屏幕的,会保持在手指离开屏幕时view的状态,但在功能上没有问题,不知道是哪里出了毛病。
作为我的第一文章,写得有点乱,也没有什么内容,至少对于一个方法中一个参数的变化过程的分析,不过这确实是我经过独立的实践之后发现的结论(油然而生的成就感),希望能够对看这文章的能有所帮助,同时也欢迎批评指正,多多交流。