viewpager_viewpagerindicator - CSDN
  • ViewPager 详解(一)---基本入门

    万次阅读 多人点赞 2019-09-11 15:37:53
    前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇...

    前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇写,研究的哪个程度就写到哪个程度吧。今天是第一篇,基本入门篇 。

     

     

    相关文章:

    1、《ViewPager 详解(一)---基本入门》

    2、《ViewPager 详解(二)---详解四大函数》

    3、《ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同》

    4、《ViewPager 详解(四)----自主实现滑动指示条》

    5、《ViewPager 详解(五)-----使用Fragment实现ViewPager滑动》

     

    首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再结合API仔细讲讲为什么要这么写。

    效果图:

    实现了三个view间的相互滑动

                         第一个VIEW向第二个VIEW滑动       第二个VIEW向第三个VIEW滑动

       

    一、新建项目,引入ViewPager控件

    ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

    1.在主布局文件里加入

     

     

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        tools:context="com.example.testviewpage_1.MainActivity" >
    
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />
    
    </RelativeLayout>

     

    其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置

    2、新建三个layout,用于滑动切换的视图

    从效果图中也可以看到,我们的三个视图都非常简单,里面没有任何的控件,大家当然可以往里添加各种控件,但这里是个DEMO,只详解原理即可,所以我这里仅仅用背景来区别不用layout布局。

    布局代码分别如下:

    layout1.xml

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical" >
        
    
    </LinearLayout>

    layout2.xml

     

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffff00"
        android:orientation="vertical" >
        
    
    </LinearLayout>
    

    layout3.xml

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff00ff"
        android:orientation="vertical" >
        
    
    </LinearLayout>
    
    

     

    二、代码实战

    先上整体代码,然后逐步讲解。

    package com.example.testviewpage_1;
    /**
     * @author  harvic
     * @date 2014.8.9
     */
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.Inflater;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    
    public class MainActivity extends Activity {
    
    	private View view1, view2, view3;
    	private ViewPager viewPager;  //对应的viewPager
    	
    	private List<View> viewList;//view数组
       
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            LayoutInflater inflater=getLayoutInflater();
            view1 = inflater.inflate(R.layout.layout1, null);
            view2 = inflater.inflate(R.layout.layout2,null);
            view3 = inflater.inflate(R.layout.layout3, null);
            
            viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
    		viewList.add(view1);
    		viewList.add(view2);
    		viewList.add(view3);
    		
    		
    		PagerAdapter pagerAdapter = 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 viewList.size();
    			}
    			
    			@Override
    			public void destroyItem(ViewGroup container, int position,
    					Object object) {
    				// TODO Auto-generated method stub
    				container.removeView(viewList.get(position));
    			}
    			
    			@Override
    			public Object instantiateItem(ViewGroup container, int position) {
    				// TODO Auto-generated method stub
    				container.addView(viewList.get(position));
    				
    				
    				return viewList.get(position);
    			}
    		};
    		
    		
    		viewPager.setAdapter(pagerAdapter);
    		
        }
    
    
    }

    代码量很小,全部放在了OnCreate()函数中。

     

    1、先看声明的变量的意义:

     

     

    private View view1, view2, view3;
    private List<View> viewList;//view数组
    private ViewPager viewPager;  //对应的viewPager

     

    首先viewPager对应 <android.support.v4.view.ViewPager/>控件。

    view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml

    viewList是一个View数组,盛装上面的三个VIEW

    2、接下来是他们的初始化过程:

     

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    LayoutInflater inflater=getLayoutInflater();
    view1 = inflater.inflate(R.layout.layout1, null);
    view2 = inflater.inflate(R.layout.layout2,null);
    view3 = inflater.inflate(R.layout.layout3, null);
    
    viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
    viewList.add(view1);
    viewList.add(view2);
    viewList.add(view3);

    初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到viewList中

     

    3、PageAdapter——PageView的适配器

     

    适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。

    PageAdapter 必须重写的四个函数:

     

    • boolean isViewFromObject(View arg0, Object arg1)
    • int getCount() 
    • void destroyItem(ViewGroup container, int position,Object object)
    • Object instantiateItem(ViewGroup container, int position)

     

    先看看各个函数,我们上面都做了什么吧:

     

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

    getCount():返回要滑动的VIew的个数

     

     

    @Override
    public void destroyItem(ViewGroup container, int position,
    		Object object) {
    	// TODO Auto-generated method stub
    	container.removeView(viewList.get(position));
    }
    

    destroyItem():从当前container中删除指定位置(position)的View;

     

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    	// TODO Auto-generated method stub
    		container.addView(viewList.get(position));
    		
    		
    		return viewList.get(position);
    	}
    };

    instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View

     

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

    isViewFromObject():对于这个函数就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。

     

    下一篇,我将仔细讲解这几个函数的意义,与有关Key的知识,当然最后也会有个例子给大家。这篇就到这了。

     

    源码地址:http://download.csdn.net/detail/harvic880925/7733249

     

    请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38453725  万分感激!!!!!

    如果你喜欢我的文章,你可能更喜欢我的公众号

    启舰杂谈

     

    展开全文
  • ViewPager使用详解

    2017-12-22 23:33:52
    ViewPager使用详解这两天看了鸿洋大神的一篇关于ViewPager的推送,将其中的内容实现了下,过程中依旧踩坑不断,现在将填坑过程中的一些解决方法及理解记录一下。ViewPager+PageAdapter这是最基本的一种使用,要注意...

    这两天看了鸿洋大神的一篇关于ViewPager的推送,将其中的内容实现了下,过程中依旧踩坑不断,现在将填坑过程中的一些解决方法及理解记录一下。

    ViewPager+PageAdapter

    这是最基本的一种使用,要注意的是,PagaAdapter中有4个必须要重写的方法:
    - getCount()
    需要在viewpager中显示的对象数。
    - isViewFromObject(View view, Object object)
    直接return view==object;
    - instantiateItem(ViewGroup container, int position)
    要显示页面的初始化,其中return 语句中返回的object才是显示的内容。
    - destroyItem(ViewGroup container, int position, Object object)
    页面不是当前显示页面,也不是缓存页面,则回调该方法将其销毁。

    ViewPager+FragmentPagerAdapter+TabLayout

    这里写图片描述
    用FragmentPagerAdapter的话,通常重写两个方法:

    @Override
               public Fragment getItem(int position) {
                   return list.get(position);
               }
    
               @Override
               public int getCount() {
                   return list.size();
               }

    这里要注意的是,在new一个FragmentPagerAdapter时,需要传入一个FragmentManager,而这个FragmentManager是v4包中的,它的获取方式是

    fragmentManager=getSupportFragmentManager();

    而不是常用的 fragmentManager1=getFragmentManager();
    我们用fragment时因为它能实现更多的逻辑,降低耦合性,而用view的话,也可以进行某些实现,但是代码就会全部冗杂在一块儿,后面如果修改就会很麻烦。
    我们可以结合TabLayout实现页面滑动时上层标签的内容改变。
    1.重写adapter中的getPageTitle()方法,它的返回值即标签中的内容

    @Override
                public CharSequence getPageTitle(int position) {
                    switch (position){
                        case 0:return "first";
                        case 1:return "second";
                        case 2:return "third";
                        default:return "hello";
                    }
               }

    这里case后不需要break了,因为用了return离开了该方法,也不需要用switch语句后用return,因为有default语句,不管是否有符合的值,都会return。
    2.将ViewPager与TabLayout“绑定”

    tabLayout.setupWithViewPager(viewPager);

    当两者绑定后,其实是TabLayout通过ViewPager调用它的getPageTitle()方法来实现联动。
    这里有一个知识点,就是FragmentPagerAdapter与FragmentStatePagerAdapter的区别,鸿洋大神写得很清楚了,这里就直接引用了。

    FragmentPagerAdapter:对于不再需要的 fragment,选择调用 onDetach() 方法,仅销毁视图,并不会销毁 fragment 实例。
    FragmentStatePagerAdapter:会销毁不再需要的 fragment,当当前事务提交以后,会彻底的将 fragmeng 从当前 Activity 的FragmentManager 中移除,state 标明,销毁时,会将其 onSaveInstanceState(Bundle outState) 中的 bundle 信息保存下来,当用户切换回来,可以通过该 bundle 恢复生成新的 fragment,也就是说,你可以在 onSaveInstanceState(Bundle outState) 方法中保存一些数据,在 onCreate 中进行恢复创建。

    总结起来就是:当页面多的时候,就用FragmentStatePagerAdapter来省内存;页面少时,就用FragmentPagerAdapter来提升效率。

    ViewPager的轮播

    1.自动无限轮播
    即在一定时间间隔时更换页面,这里通过handler就可以实现了。

     Handler handler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    if (msg.what==0011){
                        viewPager.setCurrentItem((viewPager.getCurrentItem()+1)%list.size());
                        this.sendEmptyMessageDelayed(0011,1000);
                    }
                }
            };
            handler.sendEmptyMessageDelayed(0011,1000);

    2.手动实现轮播
    所谓的手动实现轮播,就是在最后一个页面往后滑动时可以回到第一个页面。而这也是与banner很大的一个区别,banner是可以直接实现的,而viewpager我们则需要写一些内容。
    先上代码:

    @Override
                public int getCount() {
                    return Integer.MAX_VALUE;
                }
    
                @Override
                public Object instantiateItem(ViewGroup container, int position) {
    
                    View view=list.get(position%list.size());
                    ViewGroup viewGroup=(ViewGroup)view.getParent();
                    if (viewGroup!=null) viewGroup.removeView(view);
                    container.addView(view);
                    return view;
                }
    
                @Override
                public void destroyItem(ViewGroup container, int position, Object object) {}

    因为我们要实现“从尾到头”的变化,而这个变化也不知道要多少次,所以我们就通过getCount()给了一个绝对大的值来实现。
    重点在instantiateItem()中,如果我们按照之前的写法,即

    @Override
                public Object instantiateItem(ViewGroup container, int position) {
                    View view=list.get(position);
                    container.addView(view);
                    return  view;
                }
    
                @Override
                public void destroyItem(ViewGroup container, int position, Object object) {
                    container.removeView(list.get(position));
                }

    我们会发现当往回滑动的时候,程序会崩掉,这是因为图片第一次加载了,当往回滑动,它再一次加载时,我们需要在它的父类中先将该object删除了,再重新加载新的对象。
    这里还有一个要注意的是,因为我们在instantiateItem()中已经对图片的移除做了处理了,所以就不需要重写destroyItem()方法了。如果我们按照上面的代码重写了该方法,会发现显示的内容为空。

    ViewPager中滑动页面后文字改变

    我们可以选择在instantiateItem()中根据当前的position来获得文字内容,但这样滑动时会显得比较生硬,所以可以选择将textview与ViewPager分离开,通过对ViewPager添加监听,来达到页面变化时文字内容改变。

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
    
                @Override
                public void onPageSelected(int position) {
                      textView.setText(titles[position%titles.length]);
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {}
            });

    同屏显示多个页面

    这里的同屏显示多个页面,并不是ViewPager中显示多个,实际上它还是只显示了一个页面,但是我们通过它与其父布局及它与前后两个页面之间的margin来达到3个页面(部分页面)的同时出现。需要用到的几个方法:
    - clipChildren=”false”
    设定值为false后,才可以使得子view的裁剪不受影响
    - viewPager.setPageMargin( )
    设置每两个页面之间的margin
    - viewPager.setOffscreenPageLimit( )
    设置需要显示在屏幕上的页面的个数
    这里贴出xml的布局:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false">
    
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpagers"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        android:layout_gravity="center"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="60dp" />
    </LinearLayout>

    当我们实现多屏显示后,如果觉得单调,想让页面随着滑动的位置不同,改变图片的透明度,可以调用viewPager.setPageTransformer( )来增加特效。

    viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
                private static final float DEFAULT_MIN_ALPHA = 0.5f;
                private float mMinAlpha = DEFAULT_MIN_ALPHA;
                @Override
                public void transformPage(View page, float position) {
                    if (position < -1)
                    {
                        page.setAlpha(mMinAlpha);
                    } else if (position <= 1)
                    { // [-1,1]
    
                        if (position < 0) //[0,-1]
                        {
                            float factor = mMinAlpha + (1 - mMinAlpha) * (1 + position);
                            page.setAlpha(factor);
                        } else//[1,0]
                        {
                            float factor = mMinAlpha + (1 - mMinAlpha) * (1 - position);
                            page.setAlpha(factor);
                        }
                    } else
                    { // (1,+Infinity]
                        page.setAlpha(mMinAlpha);
                    }
                }
            });

    关于这个动画,还可以看下大神的另一篇文章
    巧用ViewPager 打造不一样的广告轮播切换效果

    展开全文
  • Android之ViewPager,Fragment知识全讲

    万人学习 2019-11-15 15:32:32
    本课程讲解Android中的ViewPager,Fragment及Android触摸事件的处理,ViewPager和Fragment相互嵌套冲突处理
  • ViewPager+Fragment+选项卡

    千次阅读 2019-05-22 22:01:50
    ViewPager 这是在手机上最常见的一种控件,几乎每款手机软件都会应用,ViewPager+Fragment的使用可以实现更加美观的界面和效果。 java代码: 主类: package com.example.day13; import android.support.design....

    ViewPager

    这是在手机上最常见的一种控件,几乎每款手机软件都会应用,ViewPager+Fragment的使用可以实现更加美观的界面和效果。

    在这里插入图片描述
    在这里插入图片描述

    java代码:

    主类:

    package com.example.day13;
    
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.Fragment;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.CompoundButton;
    import android.widget.RadioButton;
    
    import java.util.ArrayList;
    
    public class day13 extends AppCompatActivity {
        ViewPager vp;
        RadioButton first;
        RadioButton second;
        TabLayout tl;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_day13);
    
            vp = findViewById(R.id.vp);
            first = findViewById(R.id.first);
            second = findViewById(R.id.second);
            tl = findViewById(R.id.tb);
    
            first.setChecked(true);
            ArrayList<Fragment> list = new ArrayList<>();
            ArrayList<String> titles = new ArrayList<>();
            One one = new One();
            Two two = new Two();
    
            list.add(one);
            list.add(two);
            titles.add("选项卡1");
            titles.add("选项卡2");
            vp.setAdapter(new MyAdapter(getSupportFragmentManager(),list,titles));
            tl.setupWithViewPager(vp);
    
            first.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked){
                        vp.setCurrentItem(0);
                    }
                }
            });
    
            second.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked){
                        vp.setCurrentItem(1);
                    }
                }
            });
    
            vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int i, float v, int i1) {
    
                }
    
                @Override
                public void onPageSelected(int i) {
                    switch(i){
                        case 0:
                            first.setChecked(true);
                            break;
                        case 1:
                            second = findViewById(R.id.second);
                            second.setChecked(true);
                            break;
                    }
                }
    
                @Override
                public void onPageScrollStateChanged(int i) {
    
                }
            });
    
        }
    }
    

    适配器代码:

    package com.example.day13;
    
    
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    
    import java.util.ArrayList;
    
    public class MyAdapter extends FragmentPagerAdapter {
    
        ArrayList<Fragment> fragments;
        ArrayList<String> titles;
        public MyAdapter(FragmentManager fm, ArrayList<Fragment> fragments,ArrayList<String> titles) {
            super(fm);
            this.fragments = fragments;
            this.titles = titles;
        }
    
        @Override
        public Fragment getItem(int i) {
            return fragments.get(i);
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return titles.get(position);
        }
    }
    
    

    Fragment类代码:

    package com.example.day13;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class One extends Fragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.layout_one,container,false);
        }
    }
    
    

    效果图:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • ViewPager2 详细使用

    千次阅读 2020-04-07 21:24:04
    ViewPager2取代了ViewPager,解决了它的前身的大部分难点,包括从右到左的布局支持、垂直方向、可修改的片段集合等。 ​ 上个月的 20 号(19/11-20) ViewPager2 正式发布,用来取代 ViewPager,并且解决了很多的...

    ViewPager2取代了ViewPager,解决了它的前身的大部分难点,包括从右到左的布局支持、垂直方向、可修改的片段集合等。

    ​ 上个月的 20 号(19/11-20) ViewPager2 正式发布,用来取代 ViewPager,并且解决了很多的问题,因为原来还没有正式发布,也没有学习,今天正式的学一下

    ​ 首先,Viewpager2 是在 AndroidX 的库中,没有被内置到系统源码中,如果没有迁移 AndroidX 的赶紧迁移。下面看一下使用方式

    由于设备原因,无图(抱歉)
    

    1,添加依赖

    implementation "androidx.viewpager2:viewpager2:1.0.0"
    

    2,布局

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/page2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    ​ item 布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/page2_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    </LinearLayout>
    

    ​ 没错,他就是个空的。只是用来展示一下效果而已。

    3,适配器

    ​ ViewPage2 内部是基于 RecyclerView 实现的,意味着 Rv 的所有优点都将被继承,ViewPager 的适配器也和 Rv 是一样的。

    public class Page2Adapter extends RecyclerView.Adapter<Page2Adapter.ViewHolder> {
    
        public List<String> colors;
    
        public Page2Adapter(List<String> colors) {
            this.colors = colors;
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.page2_layout, parent, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.layout.setBackgroundColor(Color.parseColor(colors.get(position)));
        }
    
        @Override
        public int getItemCount() {
            return colors.size();
        }
    
        class ViewHolder extends RecyclerView.ViewHolder {
            LinearLayout layout;
    
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                layout = itemView.findViewById(R.id.page2_layout);
            }
        }
    
    }
    
    

    ​ 这段代码就不用解释了。

    4,使用

    List<String> colors = new ArrayList<>();
    colors.add("#FFFF00");
    colors.add("#FF0000");
    colors.add("#AAFF00");
    colors.add("#FF44FF");
    colors.add("#EEFFEE");
    colors.add("#EEE000");
    
    ViewPager2 pager2 = findViewById(R.id.page2);
    Page2Adapter adapter = new Page2Adapter(colors);
    pager2.setAdapter(adapter);
    

    5,常用的属性:

    • 切换为上下滑动

      pager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
      
    • 添加事件

       pager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                  @Override
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                      super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                      //当滚动当前页面时,将调用此方法
                  }
      
                  @Override
                  public void onPageSelected(int position) {
                      super.onPageSelected(position);
                      //当选择新页面时,将调用此方法。动画不是一定完成。
                  }
      
                  @Override
                  public void onPageScrollStateChanged(int state) {
                      super.onPageScrollStateChanged(state);
                      //当滚动状态改变时调用。
                  }
              });
      
    • 禁止滑动

      pager2.setUserInputEnabled(false);
      
    • 模拟拖拽

      findViewById(R.id.scroll_btn).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      pager2.beginFakeDrag();
                      if (pager2.fakeDragBy(-800)) {
                          pager2.endFakeDrag();
                      }
                  }
              });
      

      ​ 其中 beginFakeDrag() 方法时开启拖拽,fakeDragBy() 返回一个 boolean 类型,执行了拖动返回 true,否则返回 false。他还有一个参数,代表的是偏移量,负数表示向下一个页面滑动,反正则是上一个页面。endFakeDarg 是结束虚拟的拖拽。

    • 设置显示的 item

      pager2.setCurrentItem(1);
      
    • 获取适配器

      pager2.getAdapter();
      
    • 设置缓存

      pager2.setOffscreenPageLimit(1);
      

    PageTransformer

    ​ 无论何时滚动可见/附加页面,都会调用PageTransformer。这为应用程序提供了使用动画属性将自定义转换应用到页面视图的机会

    ​ ViewPager2 可以通过 PageTransformer 来设置页面动画,还可以 设置间距及同时添加多个 PageTransformer。

    ​ PageTransformer 是一个接口,内部只有一个方法

    void transformPage(@NonNull View page, float position);
    

    ​ 通过实现这个接口,即可自定义 ViewPager2 页面的切换动画

    ​ page :将属性转换应用于给定页面

    ​ position :这个参数非常重要。下面看一下具体的意思:

    ​ position 在 -1到 0 之间,代表向左滑动时,左侧滑出的 page 。或者向右滑动时 左侧滑入的page

    ​ position 在 0 到 1 之间,代码向左滑动时,右侧滑出的 page。或者向右滑动时,右侧滑出的page

    ​ position 小于 1 ,代表当前 page 最左侧 page。position 大于 1, 代表当前 page 最右侧的 page。(需要排除正在滑入和滑出的两个page)

    ​ 下面进入正题,设置 动画和 间距

    • 设置间距

      pager2.setPageTransformer(new MarginPageTransformer(10));
      
    • 设置动画

      设置动画也是上面的方法,那间距怎么设置呢,其实他们可以一起设置的,如下;

      CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
      compositePageTransformer.addTransformer(new MarginPageTransformer(10));
      compositePageTransformer.addTransformer(new TransFormer());
      pager2.setPageTransformer(compositePageTransformer);
      
      class TransFormer implements ViewPager2.PageTransformer {
      
              @Override
              public void transformPage(@NonNull View page, float position) {
      
                  if (position >= -1.0f && position <= 0.0f) {
                      //控制左侧滑入或者滑出的缩放比例
                      page.setScaleX(1 + position * 0.1f);
                      page.setScaleY(1 + position * 0.2f);
                  } else if (position > 0.0f && position < 1.0f) {
                      //控制右侧滑入或者滑出的缩放比例
                      page.setScaleX(1 - position * 0.1f);
                      page.setScaleY(1 - position * 0.2f);
                  } else {
                      //控制其他View缩放比例
                      page.setScaleX(0.9f);
                      page.setScaleY(0.8f);
                  }
              }
          }
      
    • 设置一屏多页的效果

       pager2.setOffscreenPageLimit(1);
       RecyclerView recyclerView = (RecyclerView) pager2.getChildAt(0);
       int padding = getResources().getDimensionPixelOffset(R.dimen._15) + getResources().getDimensionPixelOffset(R.dimen._15);
       recyclerView.setPadding(padding, 0, padding, 0);
       recyclerView.setClipToPadding(false);
      

    ViewPager2 与 Fragment

    ​ 在 ViewPager 2中新增了 FragmentStateAdapter 替代了 ViewPager 的 FragmentStatePagerAdapter 。,下面看一下简单的用法

    public class Page2FragmentAdapter extends FragmentStateAdapter {
    
        private List<Fragment> list;
    
        public static Page2FragmentAdapter start(FragmentActivity fragmentActivity, List<Fragment> fragments) {
            return new Page2FragmentAdapter(fragmentActivity, fragments);
        }
    
        public Page2FragmentAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> fragments) {
            super(fragmentActivity);
            this.list = fragments;
        }
    
        @NonNull
        @Override
        public Fragment createFragment(int position) {
            return list.get(position);
        }
    
        @Override
        public int getItemCount() {
            return list.size();
        }
    }
    
    
    List<Fragment> frags = new ArrayList<>();
    frags.add(frag1);
    frags.add(frag2);
    frags.add(frag3);
    final ViewPager2 pager2 = findViewById(R.id.page2);
    pager2.setAdapter(Page2FragmentAdapter.start(this, frags));
    pager2.setOffscreenPageLimit(1);
    

    ​ 其实和原来的差不多

    ​ 在打印日志后发现,如果不开启缓存,ViewPager2 不会默认缓存旁边的 Fragment。


    ViewPager2 的特性:

    • 基于 RecyclerView
    • 支持 竖屏滑动
    • 可禁止用户滑动页面
    • 可模拟用户滑动
    • 可同时添加多个 PageTransformer

    当然新的特性不止这么几个,更多的需要自己去发现哈。。。

    展开全文
  • ViewPager2正式版发布

    千次阅读 2019-12-16 18:38:58
    ViewPager2正式版已经发布了,具体可以看官网文档,这里主要介绍用法 一、引入 使用ViewPager2需要导入 implementation 'androidx.viewpager2:viewpager2:1.0.0' 在xml中设置orientation, 或者在代码中设置...
  • / 今日科技快讯 /近日,随着新型冠状病毒疫情继续蔓延,美国当地时间周二,谷歌通过电子邮件发布通知,建议其北美地区所有员工在家办公,并一直持续到...
  • ViewPager 全面总结

    万次阅读 多人点赞 2019-07-17 13:48:44
    Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android ...
  • ViewPager

    千次阅读 2017-09-21 10:09:25
    ViewPager 一、ViewPager简介: (一)、作用: ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。ViewPager用于实现多页面的切换效果。该类存在于Google的兼容包里面,android.support.v4...
  • Android ViewPager使用详解

    万次阅读 多人点赞 2014-08-12 15:59:25
    viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片, ViewPager的功能就是可以...
  • ViewPager 详解(二)---详解四大函数

    万次阅读 多人点赞 2019-09-11 15:38:30
    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合android...3、《ViewPager 详解(三)-...
  • ViewPager的使用方法

    万次阅读 多人点赞 2017-07-02 00:10:33
    看图先:   页面中填充内容是随机关键词飞入和飞出动画效果,随后会更新,现在请先无视吧 首先是 导入jar包 下载地址: ...布局文件里添加viewPager布局 <android.support.v4.view.ViewPager android:id=
  • ViewPager 详解(五)-----使用Fragment实现ViewPager滑动

    万次阅读 多人点赞 2019-09-11 15:39:51
    前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)---基本入门》所实现的效果。 系列文章...
  • Android 自定义 ViewPager 打造千变万化的图片切换效果

    万次阅读 多人点赞 2016-08-10 19:34:01
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记得第一次见到ViewPager这个控件,瞬间...时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如
  • 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:【张鸿洋的...有兄弟提出,ViewPager自带了一个setPageTransformer用于设置切换动画~本篇博文,将:1、介绍如何使用setPageTr
  • ViewPager 详解(四)----自主实现滑动指示条

    万次阅读 多人点赞 2019-09-11 15:39:10
    前言:前面我们用了三篇的时间讲述了有关ViewPager的基础知识,到这篇就要进入点实际的了。在第三篇《ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同》中,我们说了,PagerTabStrip和...
  • Android 使用ViewPager实现左右循环滑动图片

    万次阅读 多人点赞 2014-01-10 14:48:46
    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一些layout下的xml ...
  • Android禁止ViewPager的左右滑动

    万次阅读 多人点赞 2015-02-06 16:25:53
    有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的ViewPager禁止滑动吧,让被嵌入的...
  • TabLayout+ViewPager+Fragment实现切页展示

    万次阅读 多人点赞 2019-06-21 11:10:54
    目前大多数的APP都采用的是几个Tab标签以及多个界面滑动的形式来提供多层次的交互体验,最为常用的做法就是采用TabLayout+ViewPager+Fragment的方式,最近在公司项目中遇到类似的界面,也看了各个论坛很多份博客,...
  • 我知道你会用ViewPager,可你在ViewPager中用过Android5.0新控件CardView么?你用过PageTransformer属性吗?搞懂这几个,让你的ViewPager大放异彩!
1 2 3 4 5 ... 20
收藏数 52,056
精华内容 20,822
关键字:

viewpager