ViewPager在项目中用的地方很多,有默认的滑动动画,下面介绍一下怎么自定义动画
public void setPageTransformer(boolean reverseDrawingOrder, ViewPager.PageTransformer transformer) {
boolean hasTransformer = transformer != null;
boolean needsPopulate = hasTransformer != (this.mPageTransformer != null);
this.mPageTransformer = transformer;
this.setChildrenDrawingOrderEnabled(hasTransformer);
if (hasTransformer) {
this.mDrawingOrder = reverseDrawingOrder ? 2 : 1;
} else {
this.mDrawingOrder = 0;
}
if (needsPopulate) {
this.populate();
}
}
通过源码可以看见setPageTransformer方法是这是动画的。如果自定义只需要继续ViewPager.PageTransformer就行。
接着看源码
/**
* A PageTransformer is invoked whenever a visible/attached page is scrolled.
* This offers an opportunity for the application to apply a custom transformation
* to the page views using animation properties.
*
* <p>As property animation is only supported as of Android 3.0 and forward,
* setting a PageTransformer on a ViewPager on earlier platform versions will
* be ignored.</p>
*/
public interface PageTransformer {
/**
* Apply a property transformation to the given page.
*
* @param page Apply the transformation to this page
* @param position Position of page relative to the current front-and-center
* position of the pager. 0 is front and center. 1 is one full
* page position to the right, and -1 is one page position to the left.
*/
public void transformPage(View page, float position);
}
该接口就一个方法,在ViewPager滑动过程中会触发该方法,我们主要看下这个方法中的两个参数:
- View page:ViewPager中的页面
- position:该参数并不是指ViewPager中页面的索引,position是page相对于基准参考点的偏移量,滑动过程中可标识page的偏移程度,周期为1,current page的position为0,上一页的position为-1.0,下一页的position为1.0,依此类推。position随ViewaPger滑动趋势发生相应变化:
向左滑动时,page相对于基准参考点向左偏移,position减小;向右滑动时page相对于基准参考点向右偏移,position变大,其绝对值反应了page与基准参考点间的距离。我们可以根据position的变化,来实现想要的效果。
下面我们具体看下position的变化吧。
public static Class<? extends PageTransformer> Default = DefaultTransformer.class;
public static Class<? extends PageTransformer> Accordion = AccordionTransformer.class;
public static Class<? extends PageTransformer> BackgroundToForeground = BackgroundToForegroundTransformer.class;
public static Class<? extends PageTransformer> ForegroundToBackground = ForegroundToBackgroundTransformer.class;
public static Class<? extends PageTransformer> CubeIn = CubeInTransformer.class;
public static Class<? extends PageTransformer> CubeOut = CubeOutTransformer.class;
public static Class<? extends PageTransformer> DepthPage = DepthPageTransformer.class;
public static Class<? extends PageTransformer> FlipHorizontal = FlipHorizontalTransformer.class;
public static Class<? extends PageTransformer> FlipVertical = FlipVerticalTransformer.class;
public static Class<? extends PageTransformer> RotateDown = RotateDownTransformer.class;
public static Class<? extends PageTransformer> RotateUp = RotateUpTransformer.class;
public static Class<? extends PageTransformer> ScaleInOut = ScaleInOutTransformer.class;
public static Class<? extends PageTransformer> Stack = StackTransformer.class;
public static Class<? extends PageTransformer> Tablet = TabletTransformer.class;
public static Class<? extends PageTransformer> ZoomIn = ZoomInTransformer.class;
public static Class<? extends PageTransformer> ZoomOut = ZoomOutTranformer.class;
public static Class<? extends PageTransformer> ZoomOutSlide = ZoomOutSlideTransformer.class;
只需要实现
@Override
protected void onTransform(View view, float position) {
view.setPivotX(position < 0 ? 0 : view.getWidth());
view.setScaleX(position < 0 ? 1f + position : 1f - position);
}
view.setPivotX
view.setScaleX
等方法
就可以自己操作滑动的动画效果了。
setPageTransformer多用于ViewPager的滑动动画,下面这个项目提供了11种切换效果:
https://github.com/jfeinstein10/JazzyViewPager