viewpager切换动画

声明:本人初学者一枚,文章多为学习其他大神而写,代码和效果基本相同,敬请见谅!

参考大神:张鸿洋http://my.csdn.net/lmj623565791


package com.example.viewpager_anim;

import java.util.ArrayList;
import java.util.List;

import com.example.viewpager_anim_view.DepthPageTransformer;
import com.example.viewpager_anim_view.RotateDownPageTransformer;
import com.example.viewpager_anim_view.ZoomOutPageTransformer;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity {
    private ViewPager mViewPager;
    private int[] imgs = new int[] { R.drawable.guide_image1,
            R.drawable.guide_image2, R.drawable.guide_image3 };
    private List<ImageView> imgList = new ArrayList<ImageView>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //取消标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
        //设置切换动画
        //mViewPager.setPageTransformer(true, new DepthPageTransformer());
        mViewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        //mViewPager.setPageTransformer(true, new RotateDownPageTransformer());
        
        
        mViewPager.setAdapter(new PagerAdapter() {

            @Override
            public boolean isViewFromObject(View arg0, Object arg1) {
                // TODO Auto-generated method stub
                return arg0 == arg1;
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return imgs.length;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                ImageView imageView = new ImageView(MainActivity.this);
                imageView.setImageResource(imgs[position]);
                imageView.setScaleType(ScaleType.CENTER_CROP);
                container.addView(imageView);
                imgList.add(imageView);
                return imageView;
            }

            @Override
            public void destroyItem(ViewGroup container, int position,
                    Object object) {
                container.removeView(imgList.get(position));
            }

        });

    }

}





 

切换动画的代码主要引用的是谷歌API官方给可动画效果

第一种效果:第二张从后方显示,缩放比例和透明度逐渐改变

package com.example.viewpager_anim_view;

import android.view.View;
import android.support.v4.view.ViewPager;  


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



第二种效果:前后两张同时有缩放和透明度变化的效果

package com.example.viewpager_anim_view;


import android.annotation.SuppressLint;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
/**
 * http://blog.csdn.net/lmj623565791/article/details/40411921
 * @author zhy
 *
 */
public class RotateDownPageTransformer implements ViewPager.PageTransformer
{
	private static final float MIN_SCALE = 0.85f;
	private static final float MIN_ALPHA = 0.5f;
	private static final float ROT_MAX = 20.0f;
	private float mRot;
	private float mTrans;

	@SuppressLint("NewApi")
	public void transformPage(View view, float position)
	{

		Log.e("TAG", view + " , " + position + "");

		if (position < -1)
		{ // [-Infinity,-1)
			// This page is way off-screen to the left.
			view.setRotation(0);

		} else if (position <= 1) 
		{ // [-1,1]
			// Modify the default slide transition to shrink the page as well
			if (position < 0)
			{

				mRot = (ROT_MAX * position);
				view.setPivotX(view.getMeasuredWidth() * 0.5f);
				view.setPivotY(view.getMeasuredHeight());
				view.setRotation(mRot);
			} else
			{

				mRot = (ROT_MAX * position);
				view.setPivotX(view.getMeasuredWidth() * 0.5f);
				view.setPivotY(view.getMeasuredHeight());
				view.setRotation(mRot);
			}

			// Scale the page down (between MIN_SCALE and 1)

			// Fade the page relative to its size.

		} else
		{ // (1,+Infinity]
			// This page is way off-screen to the right.
			view.setRotation(0);
		}
	}
}

第三种效果:角度切换


package com.example.viewpager_anim_view;
      
    import android.annotation.SuppressLint;  
    import android.support.v4.view.ViewPager;  
    import android.util.Log;  
    import android.view.View;  
      
    public class ZoomOutPageTransformer implements ViewPager.PageTransformer  
    {  
        private static final float MIN_SCALE = 0.85f;  
        private static final float MIN_ALPHA = 0.5f;  
      
        @SuppressLint("NewApi")  
        public void transformPage(View view, float position)  
        {  
            int pageWidth = view.getWidth();  
            int pageHeight = view.getHeight();  
      
            Log.e("TAG", view + " , " + position + "");  
      
            if (position < -1)  
            { // [-Infinity,-1)  
                // This page is way off-screen to the left.  
                view.setAlpha(0);  
      
            } else if (position <= 1) //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0  
            { // [-1,1]  
                // Modify the default slide transition to shrink the page as well  
                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);  
                }  
      
                // Scale the page down (between MIN_SCALE and 1)  
                view.setScaleX(scaleFactor);  
                view.setScaleY(scaleFactor);  
      
                // Fade the page relative to its size.  
                view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)  
                        / (1 - MIN_SCALE) * (1 - MIN_ALPHA));  
      
            } else  
            { // (1,+Infinity]  
                // This page is way off-screen to the right.  
                view.setAlpha(0);  
            }  
        }  
    }  

demu 的xml代码:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

</RelativeLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值