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的使用

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容