返回

ViewPager2:赋能安卓应用的导航神器

Android

ViewPager2:赋能安卓应用的导航神器

在安卓应用开发中,ViewPager是一个常用的组件,它允许用户在多个页面之间滑动切换。ViewPager2是ViewPager的升级版本,它带来了许多新的特性和改进,例如支持竖直滑动、支持禁用用户输入等。

使用ViewPager2

要使用ViewPager2,首先需要在布局文件中添加ViewPager2组件。

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

然后,你需要为ViewPager2设置一个适配器。适配器负责提供ViewPager2要显示的页面。

val adapter = MyViewPager2Adapter()
view_pager2.adapter = adapter

最后,你需要在Activity或Fragment中处理ViewPager2的滑动事件。

view_pager2.addOnPageChangeListener(object : ViewPager2.OnPageChangeListener {
    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

    override fun onPageSelected(position: Int) {}

    override fun onPageScrollStateChanged(state: Int) {}
})

ViewPager2源码分析

ViewPager2的源码位于androidx.viewpager2包中。ViewPager2的实现基于RecyclerView,这意味着RecyclerView的优点将会被ViewPager2所继承。

ViewPager2的构造函数如下:

public ViewPager2(@NonNull Context context) {
    this(context, null);
}

ViewPager2的构造函数接受两个参数:Context和AttributeSet。Context是应用的上下文,AttributeSet是XML属性集。

ViewPager2的布局方法如下:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    final int width = getWidth();
    final int height = getHeight();
    final int paddingLeft = getPaddingLeft();
    final int paddingRight = getPaddingRight();
    final int paddingTop = getPaddingTop();
    final int paddingBottom = getPaddingBottom();

    final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width - paddingLeft - paddingRight, MeasureSpec.EXACTLY);
    final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height - paddingTop - paddingBottom, MeasureSpec.EXACTLY);

    final int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
        final int start = lp.leftMargin + paddingLeft;
        final int top = lp.topMargin + paddingTop;
        final int measuredWidth = child.getMeasuredWidth();
        final int measuredHeight = child.getMeasuredHeight();
        child.layout(start, top, start + measuredWidth, top + measuredHeight);
    }
}

ViewPager2的布局方法首先调用父类的布局方法。然后,它计算ViewPager2的宽度、高度、左内边距、右内边距、顶部内边距和底部内边距。

接下来,ViewPager2为每个子控件计算宽度测量规范和高度测量规范。宽度测量规范使用ViewPager2的宽度减去左右内边距,高度测量规范使用ViewPager2的高度减去上下内边距。

最后,ViewPager2遍历所有子控件,并为每个可见的子控件调用layout()方法。layout()方法将子控件放在ViewPager2中正确的位置。

ViewPager2的优点

ViewPager2相较于ViewPager有许多优点,包括:

  • 支持竖直滑动。只需要一个参数就可以改变滑动方向。
  • 支持关闭用户输入。通过setUserInputEnabled来设置是否禁止用户滑动页面。
  • 支持通过编程方式设置当前页面。
  • 支持添加页面变更监听器。
  • 支持页面预加载。

ViewPager2的缺点

ViewPager2相较于ViewPager也有