ViewPager2 是什么?
ViewPager2是Androidx里最新添加的一个元素。它可以用来实现下面这种效果:
也就是可以有多个Fragment(或者是View也可以),然后通过滑动在它们之间移动。
这种操作可以用在很多地方。比如掘金官方app里,就可以通过左右滑动来进入不同的板块,“前端”,“后端”,“Android”等。还有就是很多app在第一次启动的时候,会有一些介绍页。用户可以通过滑动进入下一个介绍页。
ViewPager2怎么用
ViewPager2的基本用法非常简单。总得来说分两步:
- 在你的layout里添加
ViewPager - 为你的
ViewPager添加一个adapter。
首先添加dependdency:
dependencies {
implementation "androidx.viewpager2:viewpager2:1.0.0"
}
然后在layout里添加ViewPager:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tab_layout"
app:layout_constraintBottom_toBottomOf="parent"
/>
最后为ViewPager添加adapter:
val viewPager = ...
viewPager.adapter = ViewPagerAdapter()
至于这个adapter怎么实现,取决于你是想要在Fragment之间滑动,还是在View之间滑动。
如果是在Fragment之间滑动,则构建一个FragmentStateAdapter的子类:
private class ViewPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
// Assuming there are three Fragmentss
override fun getItemCount(): Int = 3
override fun createFragment(position: Int): Fragment {
return when(position) {
0 -> FragmentOne()
1 -> FragmentTwo()
3 -> FragmentThree()
else -> HomeFragment()
}
}
}
如果是在View之间滑动,那么就搞一个一般的RecyclerView.Adapter:
int[] layouts = new int[]{
R.layout.slide_one,
R.layout.slide_two,
R.layout.slide_three,
R.layout.slide_four};
public class ViewsSliderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public ViewsSliderAdapter() {}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(viewType, parent, false);
return new SliderViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemViewType(int position) {
return layouts[position];
}
@Override
public int getItemCount() {
return layouts.length;
}
public class SliderViewHolder extends RecyclerView.ViewHolder {
public TextView title, year, genre;
public SliderViewHolder(View view) {
super(view);
}
}
}
可见,ViewPager2其实就是包了一个RecyclerView。
ViewPager2和TabLayout的结合
在最开始的那个例子里,不但可以在不同的Fragment之间滑动,上面的tabs也跟着变化。想要实现这个,需要使用TabLayout。
首先,加入Material depenedency:
dependencies {
implementation 'com.google.android.material:material:1.3.0-alpha04'
}
然后,在layout里添加TabLayout。可以放在ViewPager上面:
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/view_pager"
/>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tab_layout"
app:layout_constraintBottom_toBottomOf="parent"
/>
最后,在代码里加上:
private val titles = arrayOf("Tab0", "Tab1", "Tab2")
TabLayoutMediator(binding.tabLayout, binding.viewPager) {
tab: TabLayout.Tab, position: Int ->
tab.text = titles[position]
}.attach()
搞定了。
转场动画
ViewPager2支持自定义滑动动画。方法就是自建一个ViewPager2.Transformer的子类。这里有很多例子。并不是非常复杂,有兴趣的可以自己研究一下。
Reference
这个repo包含不少不错的例子,可以自己clone下来跑跑看。 github.com/ravi8x/View…