ViewPager的动画效果

转自

http://blog.csdn.net/liumeng920/article/details/51013783

原文缺乏注释,我稍微研究之后加上了关键的注释

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);

        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值