转自
原文缺乏注释,我稍微研究之后加上了关键的注释
Google给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransformer,实际上我们也可以通过实现ViewPager.PageTransformer来做出完全不同的切换动画效果。关键是要理解transformPage(View view, float position)的参数。
view理所当然就是滑动中的那个view,position这里是float类型,不是平时理解的int位置,而是当前滑动状态的一个表示,
比如当滑动到正全屏时,position是0,而向左滑动,使得右边刚好有一部被进入屏幕时,position是1,如果前一页和下一页基本各在屏幕占一半时,前一页的position是-0.5,后一页的posiotn是0.5,所以根据position的值我们就可以自行设置需要的alpha,x/y信息。
下面,我们来看看Google官方提供的两种动画效果的代码,很简单,相信每个人看过之后,都能自己实现一种动画效果
DepthPageTransformer
public
class DepthPageTransformer implements PageTransformer {
private
static float MIN_SCALE = 0.75f;
@SuppressLint("NewApi")
@Override
public
void transformPage(View view, float position) {
int
pageWidth = view.getWidth();
if(position
< -1) {
view.setAlpha(0);
}elseif(position
<= 0) {
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
}elseif(position
<= 1) {
// 在这里注释吧,这里比较关键
//View的setAlpha有两个重载 一个参数是float,一个是int
//float 是0~1,0是完全透明,1是完全不透明
//int 是1~255,1是完全透明,255是完全不透明,根据需要选择
view.setAlpha(1
- position);
设置这个会有个沉浸的效果,其实就是距离原布局水平方向的距离,负数就是往左,正数是往右
// 如果加上一个Y,则会有竖直方向上的沉浸效果
// 这个缩放函数不懂,只能记住了,归纳不出来。。。。但是函数是动画展示的关键
view.setTranslationX(pageWidth
* -position);
float
scaleFactor = MIN_SCALE + (1 - MIN_SCALE) *
(1 - Math.abs(position));
// 缩放,1为不变,小于1缩小,反之放大
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
}else{
view.setAlpha(0);
}
}
}
ZoomOutPageTransformer:
public
class ZoomOutPageTransformer implements PageTransformer {
private
static float MIN_SCALE = 0.85f;
private
static float MIN_ALPHA = 0.5f;
@Override
public
void transformPage(View view, float position) {
int
pageWidth = view.getWidth();
int
pageHeight = view.getHeight();
if(position
< -1) {
view.setAlpha(0);
}elseif(position
<= 1) {
float
scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
float
vertMargin = pageHeight * (1 - scaleFactor) / 2;
float
horzMargin = pageWidth * (1 - scaleFactor) / 2;
if(position
< 0) {
view.setTranslationX(horzMargin
- vertMargin / 2);
}else{
view.setTranslationX(-horzMargin
+ vertMargin / 2);
}
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
view.setAlpha(MIN_ALPHA
+ (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
}else{
view.setAlpha(0);
}
}
}