现在的位置: 首页 > 云计算 > 正文

什么是ViewPager2?有什么特性

2020年02月12日 云计算 ⁄ 共 4488字 ⁄ 字号 评论关闭

  什么?你还不知道ViewPager2?本篇文章将带你一览ViewPager2的风采。

  一、ViewPager2的新特性

  ViewPager2从名字就可以看出来它是ViewPager的升级版,既然是升级版那么它相比ViewPager有哪些新功能和哪些API变化呢?我们接着往下看。

  ViewPager2新特性

  基于RecyclerView实现。这意味着RecyclerView的优点将会被ViewPager2所继承。

  支持竖直滑动。只需要一个参数就可以改变滑动方向。

  支持关闭用户输入。通过setUserInputEnabled来设置是否禁止用户滑动页面。

  支持通过编程方式滚动。通过fakeDragBy(offsetPx)代码模拟用户滑动页面。

  CompositePageTransformer 支持同时添加多个PageTransformer。

  支持DiffUtil ,可以添加数据集合改变的item动画。

  支持RTL (right-to-left)布局。我觉得这个功能对国内开发者来说可能用处不大..

  相比ViewPager变化的API

  ViewPager2相比ViewPager做了哪些改变呢?研究了一番之后我大概列出以下几点:

  ViewPager2与ViewPager同是继承自ViewGrop,但是ViewPager2被声明成了final。意味着我们不可能再像ViewPager一样通过继承来修改ViewPager2的代码。

  FragmentStatePagerAdapter被FragmentStateAdapter 替代

  PagerAdapter被RecyclerView.Adapter替代

  addPageChangeListener被registerOnPageChangeCallback。我们知道ViewPager的addPageChangeListener接收的是一个OnPageChangeListener的接口,而这个接口中有三个方法,当想要监听页面变化时需要重写这三个方法。而ViewPager2的registerOnPageChangeCallback方法接收的是一个叫OnPageChangeCallback的抽象类,因此我们可以选择性的重写需要的方法即可。

  移除了setPargeMargin方法。

  以上所罗列的新特性和API可能并不完整,如有疏漏可以留言补充。

  二、 开启ViewPager2之旅

  ViewPager2位于androidx包下,也就是它不像ViewPager一样被内置在系统源码中。因此,使用ViewPager2需要额外的添加依赖库。另外,android support中不包含ViewPager,也就是要使用ViewPager2必须迁移到androidx才可以。

  1.添加依赖,目前ViewPager2的最新版本是1.0.0:

  dependencies {

  implementation "androidx.viewpager2:viewpager2:1.0.0"

  }

  2.ViewPager2布局文件:

  < androidx.viewpager2.widget.ViewPager2   android:id="@+id/view_pager"   android:layout_width="match_parent"   android:layout_height="match_parent"   app:layout_constraintBottom_toBottomOf="parent"   app:layout_constraintLeft_toLeftOf="parent"   app:layout_constraintRight_toRightOf="parent"   app:layout_constraintTop_toTopOf="parent" />

  3.ViewPager2的Adapter

  因为ViewPager2内部封装的是RecyclerView,因此它的Adapter也就是RecyclerView的Adapter。

  class MyAdapter : RecyclerView.Adapter() {

  private var mList: List = ArrayList()

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerViewHolder {

  val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_page, parent, false)

  return PagerViewHolder(itemView)

  }

  override fun onBindViewHolder(holder: PagerViewHolder, position: Int) {

  holder.bindData(mList[position])

  }

  fun setList(list: List) {

  mList = list

  }

  override fun getItemCount(): Int {

  return mList.size

  }

  // ViewHolder需要继承RecycleView.ViewHolder

  class PagerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

  private val mTextView: TextView = itemView.findViewById(R.id.tv_text)

  private var colors = arrayOf("#CCFF99","#41F1E5","#8D41F1","#FF99CC")

  fun bindData(i: Int) {

  mTextView.text = i.toString()

  mTextView.setBackgroundColor(Color.parseColor(colors[i]))

  }

  }

  }

  item_page中代码如下:

  < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:gravity="center">

  < TextView   android:id="@+id/tv_text"   android:background="@color/colorPrimaryDark"   android:layout_width="match_parent"   android:layout_height="280dp"   android:gravity="center"   android:textColor="#ffffff"   android:textSize="22sp" />

  < /LinearLayout>

  4.在Activity中为ViewPager设置Adapter:

  val viewPager2 = findViewById(R.id.view_pager)

  val myAdapter = MyAdapter()

  myAdapter.setList(data)

  viewPager2.adapter = myAdapter

  很简单就完成了一个ViewPager的功能。

  5. ViewPager2竖直滑动

  接下来我们通过一行代码为其设置竖直滑动:

  viewPager2.orientation = ViewPager2.ORIENTATION_VERTICAL

  竖直滑动用ViewPager是很难实现的,而通过ViewPager2只需要设置一个参数即可。

  6. 页面滑动事件监听

  上文已经提到过了,我们为ViewPager设置页面滑动的监听事件需要重写三个方法,而为ViewPager2设置监听事件只需要重写需要的方法即可,因为ViewPager2中OnPageChangeCallback是一个抽象类。

  viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {

  override fun onPageSelected(position: Int) {

  super.onPageSelected(position)

  Toast.makeText(this@MainActivity, "page selected $position", Toast.LENGTH_SHORT).show()

  }

  })

  7. setUserInputEnabled与fakeDragBy

  我们知道,在使用ViewPager的时候想要禁止用户滑动需要重写ViewPager的onInterceptTouchEvent。

  而ViewPager2被声明为了final,我们无法再去继承ViewPager2。

  那么我们应该怎么禁止ViewPager2的滑动呢?其实在ViewPager2中已经为我们提供了这个功能,只需要通过setUserInputEnabled即可实现。

  viewPager2.isUserInputEnabled = false

  同时ViewPager2新增了一个fakeDragBy的方法。通过这个方法可以来模拟拖拽。在使用fakeDragBy前需要先beginFakeDrag方法来开启模拟拖拽。

  fakeDragBy会返回一个boolean值,true表示有fake drag正在执行,而返回false表示当前没有fake drag在执行。我们通过代码来尝试下:

  fun fakeDragBy(view: View) {

  viewPager2.beginFakeDrag()

  if (viewPager2.fakeDragBy(-310f))

  viewPager2.endFakeDrag()

  }

  需要注意到是fakeDragBy接受一个float的参数,当参数值为正数时表示向前一个页面滑动,当值为负数时表示向下一个页面滑动。

  三、 ViewPager2的PageTransformer

  相比ViewPager,ViewPager2的Transformer功能有了很大的扩展。

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

抱歉!评论已关闭.