经过它咱们能够给图片增长组合动画效果,也能够写成一个图片查看器。android
好比咱们首次安装应用的时候,不少就会用到ViewPager给咱们作一个应用简介。今天要写的也是这个--怎么用ViewPager实现动画切换效果。git
1.经过谷歌提供给咱们的样例代码实现切换效果,由于咱们进不了谷歌的官方api,因此我直接贴出代码github
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f; public void transformPage(View view, float position) {
int pageWidth = view.getWidth(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 0) { // [-1,0] // Use the default slide transition when moving to the left page view.setAlpha(1); view.setTranslationX(0); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { // (0,1] // Fade the page out. view.setAlpha(1 - position); // Counteract the default slide transition view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); }
}
}
使用方法:api
mViewPager = (ViewPager) findViewById(R.id.viewPager); //为ViewPager添加动画效果 mViewPager.setPageTransformer(true,new DepthPageTransformer());
这里提供的是切换页面是透明度逐渐变化的效果,可是这种方法只支持android3.0以上的版本。由于是有api11以上才加入了属性动画。
若是须要兼容安卓3.0如下,须要加入一个jar包:JazzyViewPager第三方开源项目。能够去github搜索下载。后面我会把下载资源地址加上ide
或者把ViewPager类的所有内容考到本身的方法中(ViewPagerCompat),注释掉判断api版本的代码,而后引用此包而非引用ViewPager也能够解决兼容问题。学习
最后,自定义ViewPager。动画
经过分析谷歌给咱们的样例代码,咱们知道实现动画效果实际上就是值(float)之间的变化,而在自己ViewPager方法中position,offset,offsetPixels是经过页面滑动不断变化的。因此咱们能够经过活用这三个参数实现动画切换效果。spa
public class MyViewPager extends ViewPager { private View mLeft; private View mRight; private float mTrans; private float mScale; private static final float MIN_SCALE = 0.5f; //经过map集合保存动画和视图 private Map<Integer, View> mChildren = new HashMap<Integer, View>(); public void setViewForPosition(View view, int position) { mChildren.put(position, view); //设置 //加入这个方法须要在main的 instantiateItem中注册声明,集体代码以下 // mViewPager.setViewForPosition(mImageView, position); } public void removeViewFromPosition(Integer position) { mChildren.remove(position); //移除 //加入这个方法须要在main的 destroyItem中注册使用,集体代码以下 //mViewPager.removeViewFromPosition(position); } public MyViewPager(Context context) { super(context); } @Override protected void onPageScrolled(int position, float offset, int offsetPixels) { //得到当前的left和right的图片 position为0/1/2/3的整数值 mLeft = mChildren.get(position); mRight = mChildren.get(position+1); animStatck(mLeft, mRight, offset, offsetPixels); super.onPageScrolled(position, offset, offsetPixels); } private void animStatck(View left, View right, float offset, int offsetPixels) { //当右边的图片所有滑动至彻底显示时 if (right != null) { //从第A页到第B页 offset0~1 mScale = (1 - MIN_SCALE) * offset + MIN_SCALE; mTrans = -getWidth() - getPageMargin() + offsetPixels; if(offset==0){//若是不置为0,会在滑动时出现下一个页面的图片 mTrans = 0; mScale = 0; } //Viewhelper为第三方jar报提供的方法,使用这个第三方jar包也能够解决兼容性问题 ViewHelper.setScaleX(right,mScale); ViewHelper.setScaleX(right,mScale); ViewHelper.setTranslationX(right, mTrans); ViewHelper.setAlpha(right,offset); } if(left!=null){ left.bringToFront(); ViewHelper.setAlpha(right, offset); } } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } }须要注意的是,安卓3.0以上给咱们提供了
mViewPager.setPageTransformer(true,new DepthPageTransformer());方法设置动画,其中第二个参数为定义的动画效果类。
学习Viewpager我么须要注意的是或用第三方类,固然若是你自我要求比较高,能够尝试实现自动义的Viewpager动画。自定义Viewpager动画中,须要参考第三方jar的代码,经过你想要的动画,须要什么属性着手,活用其中的变量orm