ViewPager2 简单使用

1.viewpager2概念及特点

ViewPager2 是 ViewPager 库的改进版本,可提供增强型功能并解决使用 ViewPager 时遇到的一些常见问题。

1.1 ViewPager2 的优势

  • 垂直方向支持
    除了支持传统的水平分页之外,ViewPager2 还支持垂直分页。您可以通过设置 ViewPager2 元素的 android:orientation 属性为其启用垂直分页:
<androidx.viewpager2.widget.ViewPager2
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:orientation="vertical" />
    
  • 从右到左支持

ViewPager2 支持从右到左 (RTL) 分页。系统会根据语言区域在适当的情况下自动启用 RTL 分页,不过您也可以通过设置 ViewPager2 元素的 android:layoutDirection 属性为其手动启用 RTL 分页:

<androidx.viewpager2.widget.ViewPager2
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layoutDirection="rtl" />
    
  • 可修改的 Fragment 集合
    ViewPager2 支持对可修改的 Fragment 集合进行分页浏览,在底层集合发生更改时调用 notifyDatasetChanged() 来更新界面。
    这意味着,您的应用可以在运行时动态修改 Fragment 集合,而 ViewPager2 会正确显示修改后的集合。

  • DiffUtil
    ViewPager2 在 RecyclerView 的基础上构建而成,这意味着它可以访问 DiffUtil 实用程序类。这一点带来了多项优势,但最突出的一项是,这意味着 ViewPager2 对象本身会利用 RecyclerView 类中的数据集更改动画

  • 支持嵌套的可滚动元素
    在嵌套的滚动视图与包含它的 ViewPager2 对象方向相同的情况下,ViewPager2 本身并不支持该滚动视图。例如,在垂直方向的 ViewPager2 对象内,垂直滚动视图无法滚动。
    为了支持方向相同的 ViewPager2 对象内的滚动视图,如果您希望改为滚动嵌套的元素,则必须对 ViewPager2 对象调用 requestDisallowInterceptTouchEvent()。ViewPager2 嵌套滚动示例展示了一种使用通用自定义封装容器布局解决此问题的办法。
    参考:https://developer.android.com/training/animation/vp2-migration?hl=zh-cn#nested-scrollables

1.2 ViewPager2 API

//是否接收外界事件
viewPager.isUserInputEnabled 
//viewpager的方向
viewPager.orientation 

//跳转到指定位置,是否有平滑效果
viewPager.setCurrentItem(card, smoothScroll)

//页面切换的时候,执行动效
viewPager.setPageTransformer(mAnimator)

/**
 * PageTransformer 是个接口,
 * 重写方法transformPage(view ,pos)
 *
 */
private val mAnimator = ViewPager2.PageTransformer { page, position ->
    val absPos = Math.abs(position)
    page.apply {
        //设置view的rotation
        this.rotation = if (rotateCheckBox.isChecked) position * 360 else 0f
        //设置view的tranlationXY
        this.translationY = if (translateY) absPos * 500f else 0f
        this.translationX = if (translateX) absPos * 500f else 0f
        if (scaleCheckBox.isChecked) {
            val scale = if (absPos > 1) 0F else 1 - absPos
            //设置view的scaleXY
            this.scaleX = scale
            this.scaleY = scale
        } else {
            this.scaleX = 1f
            this.scaleY = 1f
        }
    }
}

2 使用方式

2.1 viewpager2+ view

使用viewpager+recycler.Adapter+view的形式完成

class CardViewAdapter : RecyclerView.Adapter<CardViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        return CardViewHolder(CardView(LayoutInflater.from(parent.context), parent))
    }

    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        holder.bind(Card.DECK[position])
    }

    override fun getItemCount(): Int {
        return Card.DECK.size
    }
}

class CardViewHolder internal constructor(private val cardView: CardView) :
    RecyclerView.ViewHolder(cardView.view) {
    internal fun bind(card: Card) {
        cardView.bind(card)
    }
}


open class CardViewActivity : BaseCardActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //设置适配器
        viewPager.adapter = CardViewAdapter()
    }
}

2.2 viewpager2+ fragment

viewpager2+FragmentStateAdapter+fragment

 viewPager.adapter = object : FragmentStateAdapter(this) {
            override fun createFragment(position: Int): Fragment {
                return CardFragment.create(Card.DECK[position])
            }

            override fun getItemCount(): Int {
                return Card.DECK.size
            }
        }

2.3 viewpager2+ tablayout

主要借助于TabLayoutMediator类绑定tablayout和viewpager2

  tabLayout = findViewById(R.id.tabs)
  TabLayoutMediator(tabLayout, viewPager) { tab, position ->
      tab.text = Card.DECK[position].toString()
  }.attach()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值