ViewPager,算是Android开发中的一个十分常用的组件了。我们今天来讨论下ViewPager的切面动画定制。
自定义切页动画
默认情况下,系统已经给ViewPager切页添加了一个滑动动画,简单低调,效果也不赖。
不过,如果对这个切页动画有特殊需求,我们也可以自定义一个动画效果,只需要实现系统接口ViewPager.PageTransformer,然后调用方法setPageTransformer()设置给ViewPager即可。
PageTransformer简介
PageTransformer,译成“页面变形金刚”是不是略微高调了?还是叫原名吧……其实,这个接口名自带变形金刚属性(Transformer),自然就告诉我们,通过它,我们可以实现出各种各样的切页动画。
1 |
|
每当有可见的ViewPage页滚动时,都将触发PageTransformer回调。借助属性动画系统,在方法transformPage回调的时候,就可以通过改变属性值来实现定制动画了。
对于页面切换过程中的每一个状态点,回调transformPage方法的页面包括:
- 当前可见页
- 当前页相邻前(左)页
- 当前页相邻后(右)页
transformPage的第一个参数就是回调页的引用。第二个参数position是指回调页相对于屏幕中央的定位值,将会随着滚动页变化。position的值的意义,如下表说明一下。
position值 | 说明 | 备注 |
---|---|---|
0 | 页占满屏幕,即完全显示状态的定位值 | |
-1 | 当前页占满屏幕时的前一页定位值 | |
1 | 当前页占满屏幕时的后一页定位值 | |
(-1, 0) | 前一页渐入/渐出的定位值 | 渐入时,终点定位为0,即将成为“当前页” |
(0, 1) | 后一页渐入/渐出的定位值 | 渐入时,终点定位为0,即将成为“当前页” |
如果前页、当前页、后页的定位值分别用P、C、N表示,那它们满足以下等式:
1 |
|
其实,上面等式的原因就是:“前页+当前页”,或“当前页+后页”,总是构成一个整屏。
DepthPageTransformer
说了这么多,先用官方的例子来具体看看PageTransformer如何实现吧。
1 |
|
从代码上来讲,动画包括了alpha、translation和scale三个属性变化,最终实现“深度式切页”动画。根据回调的position值,确定了当前回调页的类型(如前文表格),然后设置不同的状态属性值。简单明了。
效果如下图
DiagonalZoomPageTransformer(对角线缩放切页)
官方例子,很简单,照猫画狐,也不是难事。下面我们来实现一个延对角线渐显进入、渐隐退出,并且伴随尺寸放缩的切页动画。
直接上代码。
1 |
|
重点在于两个else if分支,它们都调用方法update方法进行更新,和控制属性动画一样,很简单。
效果如下。
小结
一般情况下,对于ViewPager的切页效果,都不会有特殊需求。当然,有特殊