android的动画是相当丰富的,起初想到了用Animation来做,但是ViewPage提供的方法实在无法达到预期的效果,又尝试了重写ViewPage,使用Camera来对页面进行重画,但只能控制到单页,整体效果不达标,最后不得不放弃以上两种方式,当然,这里面能力的因素是客观存在的。
在网上百度了半天,不得不说现在的“拷贝党”成员广大,搜索了半天全是一模一样的,浪费精力不说,还一肚子火,做程序开发的都有同感,当一个问题久久不能解决,在希望和失望之间徘徊时,那种心境真是一种煎熬。
休息了一天,最后下狠心,直接把android官方的API拿来研究,最后在api中找到了方法:
ViewPage提供了一个内部接口PageTransformer,用于控制两页之间的切换控制,在PageTransformer中只有一个方法 public void transformPage(View view, float position),在这个方法中,可以实现对两个页面的完美控制。
public void transformPage(View view, float position)中很关键的是参数position,它是页面相对ViewPage中心位置的距离百分比,介于-1和1之间,进入者由-1向0变化,退出者由0向1变化,当页面的距离百分比为0时,界面被选中,即触发ViewPage的onPageSelected事件。
通过判定position的值,可以定位当前作用的页面是进入页面还是退出页面,并做出相应的业务逻辑,这里直接给出官方的例子供大家参考
public class DepthPageTransformer implements ViewPager.PageTransformer { private static float MIN_SCALE = 0.75f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { view.setAlpha(0); } else if (position <= 0) { view.setAlpha(1); view.setTranslationX(0); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { view.setAlpha(1 - position); view.setTranslationX(pageWidth * -position); float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { view.setAlpha(0); } } }
最后直接调用ViewPage的 setPageTransformer() 方法设置创建的PageTransformer 实例即可