引入
1 | implementation "androidx.viewpager2:viewpager2:1.0.0" |
前言
ViewPager2与ViewPager同是继承自ViewGrop,但是ViewPager2被声明成了final。意味着我们不可能再像ViewPager一样通过继承来修改ViewPager2的代码。
简单使用Demo
基本思路
1、一个子项布局
2、一个adapter适配器
3.、在主布局引入viewpager2
4、viewpager2对象添加adapter
activity_main.xml
1 |
|
item_text.xml
和recyclerview一样,该布局是适配器(即子项页面的布局)要用到的布局。
1 |
|
ViewAdapter.java
1 | public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.ViewPagerHolder> { |
MainActivity.java
1 | public class MainActivity extends AppCompatActivity { |
效果
与 Fragment 结合
在使用 ViewPager 的时候,可以使用 FragmentPagerAdapter 实现页数小的情况,用 FragmentStatePagerAdapter 实现页面比较多的情况。ViewPager2 则没有那么复杂,直接使用 FragmentStateAdapter 即可。
基本思路
1、fragment的布局
2、一个Adapter`承于FragmentStateAdapter
3、在主布局引入viewpager2
4、viewpager2 添加adapter
fm_demo.xml
fragment的布局
1 |
|
DemoFragment.java
1 | public class DemoFragment extends Fragment { |
FragmentAdapter.java
1 | class FragmentAdapter extends FragmentStateAdapter { |
MainActivity.java
主布局和前面简单demo一样,只有一个viewpager2
1 | public class MainActivity extends AppCompatActivity { |
效果
配合 TabLayout 使用
基本思路
1、需要的布局中引入 tabLayout 和 viewPage2
2、一个Tab项的布局页面
3、一个页面适配器 Adapter 继承自 FragmentStateAdapter
4、创建Tab ,并添加到TabLayout中
5、viewpager2对象添加前面的适配器 Adapter
6、ViewPager2 配合 TabLayout 的联动 方式一:TabLayoutMediator进行绑定 attach() 方式二:原始的监听事件中操作
7、选择性的注册 TabLayout 的选择事件监听 和 viewpage2的事件监听
布局中引入
activity_main.xml
1 |
|
Tab项的布局页面
tab_item.xml
1 |
|
页面适配器 TabAdapter
TabAdapter.java
1 | public class TabAdapter extends FragmentStateAdapter { |
MainActivity.java
1 | public class MainActivity extends AppCompatActivity { |
说明
TabLayout
使用自定义布局和ViewPager2
联动时会出现问题,TabLayout
的自定义效果会无效,所以要想使用自定义的tablayout布局 ,就采用最原始的联动
原始联动
即在上面监听事件的基础上进行修改:
1 | tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { |
效果
常用法
页面滑动事件监听
1 | //滑动监听 |
禁止滑动
1 | //禁止用户滑动 false为禁止滑动 true为可以滑动 |
设置页面间距
1 | vp2.setPageTransformer(new MarginPageTransformer(10)) //页面间距为10dp |
组合页面效果
1 | CompositePageTransformer compositePageTransformer = new CompositePageTransformer(); |
1 | private class ScaleInTransformer implements ViewPager2.PageTransformer { |
大概类似于下面这种滑动效果
transformPage(@NonNull View view, float position)
- 第一个参数,就是你当前想要进行transform的view。
- 第二参数position,我们通常会第一反应理解为是这个view在整个ViewPager中的第几个,但是在这里我们要注意,它并不是一个int型数据,而是一个浮点型,所以它代表的是第一个参数view的左上角x轴坐标参数。
我们都知道,对于手机屏幕来说,屏幕左上角为坐标原点(0,0),那么在ViewPager显示第一个View时,View1的position就是0,但是当我们往左滑动的时候,它就会慢慢发生变化。当滑动结束的时候,View1的位置就从原来手机屏幕的位置,到了屏幕左边的位置,它的position就从0.0变成了-1.0。而对于第二个View,当屏幕还在展示View1时,它是在屏幕的右边,所以它的position就是1.0。当左滑结束,View2显示在屏幕上时,它的position就从1.0变成了0.0。依次可以类推。
ViewPager2的一屏多页效果
ViewPager2的一屏多页实现跟ViewPager并无多大差别。需要把ViewPager2父容器的clipChildren设置为false,同时ViewPager2的clipChildren也设置为false并且将ViewPager2的offscreenPageLimit 设置为2以及为ViewPager2设置marge即可。代码如下:
1 | LinearLayout linearLayout = findViewById(R.id.linearLayout); |
Demo地址
https://github.com/Commandercc/DemoEX/blob/master/ViewPager2Demo.zip