您的位置:首页 > 移动开发 > Android开发

ViewPager的过渡动画

2016-05-01 10:28 323 查看

开篇

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

没有前戏,直接上重点

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

关于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的状态,但在功能上没有问题,不知道是哪里出了毛病。

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android viewpager 动画