利用PageTransformer实现viewpager的视差效果变换和反转特效

来源:互联网 发布:nodejs数据返回页面 编辑:程序博客网 时间:2024/06/03 21:01

利用PageTransformer实现viewpager的几种切换效果,适合做欢迎页,代码比较简单,但是效果还不错,核心主要是PageTransformer的使用。

page在切换的时候会调用transformPage(View page, float position)方法,注意是多个page不停的调用这方法,参数page就是调用此方法的view,参数position就是这个view的位置信息。0代表当前view,-1代表左边的相邻的view,1代表右面相邻的view。在本项目中,我们只操作-1~1之间的view(也就是用户可能会见的view)。

 @Override    public void transformPage(View page, float position) {        if (position > -1 && position < 1) {            initransforPage(page, position);        }    }


先看第一种效果

在page切换过程中加入放大缩小的动画,根据position判断page缩放的程度。

   page.setScaleX(1-Math.abs(position));                page.setScaleY(1-Math.abs(position));

第二种效果

这种效果跟上面的效果类似,只不过添加了缩小的最小限度,最小设置成0.9f

 page.setScaleX(Math.max(0.9f,1-Math.abs(position))); page.setScaleY(Math.max(0.9f,1-Math.abs(position)));

第三种效果

利用翻转动画实现了page切换,根据position来确定setPivotX参数和反转的角度

  page.setPivotX(position<0f?page.getWidth():0f);  page.setPivotY(page.getHeight()*0.5f);  page.setRotationY(position*45);
第四种效果


同样是反转,只不过反过来了而已

 page.setPivotX(page.getWidth()*0.5f); page.setPivotY(page.getHeight()*0.5f); page.setRotationY(-position*45);
第五种效果


gif图的关系效果不是很明显,其实这是一种视差效果。根据position和view的宽度给page中每个子view赋予不同的偏移量,形成这种视差移动的效果。

 ViewGroup v = (ViewGroup) page.findViewById(R.id.rl);                int childCount = v.getChildCount();                for (int i = 0; i < childCount; i++) {                    View childView = v.getChildAt(i);                    float factor = (float) Math.random();                    if (childView.getTag() == null) {                        childView.setTag(factor);                    } else {                        factor = (float) childView.getTag();                    }                    childView.setTranslationX(factor * childView.getWidth() * position);                }                break;

以上就是这几种效果的全部核心代码,也可以根据自己需求组合变换。主要是抛砖引玉,哈哈哈。

下载链接:http://download.csdn.net/detail/liujiayut800/9885267

阅读全文
2 0
原创粉丝点击