2019-05-14

ViewPager的详细介绍

 简介

Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android studio进行开发,默认导入v7包,v7包含了v4,所以不用导包,越来越方便了。

Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充ViewPager的,这样 可以更加方便的生成每个Page,以及管理每个Page的生命周期。


简单使用

1.xml的引用

<android.support.v4.view.ViewPager

android:id="@+id/vp"

android:layout_width="match_parent"

android:layout_height="match_parent">

</android.support.v4.view.ViewPager>

2.使用 

//找到控件

       ViewPager    vp  = (ViewPager) findViewById(R.id.vp);

//创建view集合

       Arraylist<View> mView = new ArrayList<>();

        //找到需要往view中添加的布局

        View viewone = LinearLayout.inflate(this, R.layout.vpone, null);

        View viewtwo = LinearLayout.inflate(this, R.layout.vptwo, null);

        View viewthree = LinearLayout.inflate(this, R.layout.vpthree, null);

        //添加

        mView.add(viewone);

        mView.add(viewtwo);

        mView.add(viewthree);

//viewpager的适配器(设配器单独创建一个类去写)

vp.setAdapter(new PagerAdapter() {

            @Override

            public int getCount() {

                return mView.size();

            }

            @Override

            public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {

                return view==object;

            }

            @Override

            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

                container.removeView(mView.get(position));

            }

            @NonNull

            @Override

            public Object instantiateItem(@NonNull ViewGroup container, int position) {

                       View view = mView.get(position);

                     container.addView(view);

                      return view;

            }

        });

实现效果



翻页动画

ViewPager有个方法叫做:

setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) 用于设置ViewPager切换时的动画效果,并且google官方还给出了两个示例(因为使用的是属性动画,所以不兼容3.0以下)。

1. DepthPageTransformer

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

        }

    }

}

调用

vp.setPageTransformer(false,new DepthPageTransformer());

实现效果


2. ZoomOutPageTransformer

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

        }

    }

}

调用

vp.setPageTransformer(false,new ZoomOutPageTransformer());

实现效果


3. 自定义动画

public class RotateDownPageTransformer implements ViewPager.PageTransformer {

    private static final float ROT_MAX = 20.0f;

    private float mRot;

    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) // a页滑动至b页 ; a页从 0.0 ~ -1 ;b页从1 ~ 0.0

        { // [-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);

        }

    }

}

实现效果


position说明:

当前显示页为0,前一页为-1,后一页为1,滑动过程中数值不断变大或变小,所以为float类型

翻页监听

vp.addOnPageChangeListener(newViewPager.OnPageChangeListener() {

@Override

publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels) {

Log.e("vp","滑动中=====position:"+position+"   positionOffset:"+positionOffset+"   positionOffsetPixels:"+positionOffsetPixels);

}

@Override

publicvoidonPageSelected(intposition) {

Log.e("vp","显示页改变=====postion:"+position);

   }

@Override

publicvoidonPageScrollStateChanged(intstate) {

switch(state) {

caseViewPager.SCROLL_STATE_IDLE:

Log.e("vp","状态改变=====SCROLL_STATE_IDLE====静止状态");

break;

caseViewPager.SCROLL_STATE_DRAGGING:

Log.e("vp","状态改变=====SCROLL_STATE_DRAGGING==滑动状态");

break;

caseViewPager.SCROLL_STATE_SETTLING:

Log.e("vp","状态改变=====SCROLL_STATE_SETTLING==滑翔状态");

break;

       }

   }

});

1.onPageScrolled(int position, float positionOffset, int positionOffsetPixels)

页面滑动状态停止前一直调用

position:当前点击滑动页面的位置 

positionOffset:当前页面偏移的百分比 

positionOffsetPixels:当前页面偏移的像素位置

2.onPageSelected(int position)

滑动后显示的页面和滑动前不同,调用

position:选中显示页面的位置

3.onPageScrollStateChanged(int state)

页面状态改变时调用

state:当前页面的状态

SCROLL_STATE_IDLE:空闲状态 

SCROLL_STATE_DRAGGING:滑动状态 

SCROLL_STATE_SETTLING:滑动后滑翔的状态

ViewPager+Fragment+Tablayout的使用

                                                             今天累了,下次再写!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容