介绍
ViewPager 是由 Android v4 包提供的一个组件,它是 ViewGroup 的子类,所以它也是一个容器类,可以在其中添加其他的 view 类。ViewPager 需要一个 PagerAdapter 适配器给它提供数据,它使用的监听器是 OnPageChangeListener,用于监听页面切换的事件。在 Android 中,该组件经常被使用在左右滑动时显示多个页面的运行效果。网易云一开始使用时的引导界面
安卓SDK升级后,V4包会找不到报错,更新后android.support.v4.view.ViewPager被androidx.viewpager.widget.ViewPager所取代,所有关于v4的包都要替换掉。具体如何修改:修改XML文件中的android.support.v4.view.ViewPager为androidx.viewpager2.widget.ViewPager2或者androidx.viewpager.widget.ViewPager。并在依赖库中添加下面的包:
implementation 'androidx.viewpager:viewpager:1.0.0'
或者
implementation "androidx.viewpager2:viewpager2:1.0.0"
基本语法:
- 添加方向指定从右到左 android:layoutDirection="rtl"
- 添加方向指定垂直滑动 android:orientation="vertical"
<!--ViewPager组件-->
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"/>
相关方法
(1)PagerAdapter:ViewPager 的适配器。创建该对象时需要重写它的 4 个方法。具体方法如下:
- instantiateItem(): 将当前视图添加到视图容器中并返回当前所显示的视图。
- destroyItem():从视图容器中移除指定位置的页面。
- getCount():可用滑动页面的数量。
- isViewFromObject(): 确定页面视图是否与返回的对象相关联 , 返回 view == object 即可。
(2)ViewPager.OnPageChangeListener:页面切换时的监听事件,其中需要实现的 3 个方法如下:
- onPageScrollStateChanged(): 在翻译状态发生改变时被调用。
- onPageScrolled():在翻页过程中该方法被调用。
- onPageSelected(): 当页面被选中时该方法被调用。
例子
模拟APP引导界面
编写布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--ViewPager组件-->
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"/>
</RelativeLayout>
创建layout1、layout2、layout3,主要改变背景就行
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg1">
</LinearLayout>
layout4中多添加一个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg4">
<!--启动主界面的按钮-->
<Button
android:id="@+id/btn"
android:layout_width="170dp"
android:layout_height="50dp"
android:text="Hi"
android:textColor=" #000000"
android:layout_gravity="center_horizontal"
android:layout_marginTop="360dp"
android:background="@color/teal_700"
android:onClick="onEnter"
android:textSize="20sp"
android:textAllCaps="false"/>
</LinearLayout>
编写ViewPagerActivity
public class ViewPagerActivity extends AppCompatActivity {
private View view1, view2, view3, view4; //4个页面视图
private List<View> viewList; //保存页面的数组列表
private ViewPager viewPager; //ViewPager组件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
//隐藏标题栏
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
init();
viewPager.setAdapter(adapter); //设置适配器
}
//相关初始化
private void init(){
LayoutInflater lf = getLayoutInflater().from(this); //获取布局填充器
viewPager = (ViewPager) findViewById(R.id.viewPager); //获取ViewPager组件
view1 = lf.inflate(R.layout.layout1, null); //加载页面1的布局文件
view2 = lf.inflate(R.layout.layout2, null); //加载页面2的布局文件
view3 = lf.inflate(R.layout.layout3, null); //加载页面3的布局文件
view4 = lf.inflate(R.layout.layout4, null); //加载页面4的布局文件
viewList = new ArrayList<View>(); //创建保存4个页面的数组列表
viewList.add(view1); //向数组列表中添加第1个页面
viewList.add(view2); //向数组列表中添加第2个页面
viewList.add(view3); //向数组列表中添加第3个页面
viewList.add(view4); //向数组列表中添加第4个页面
}
//创建 PagerAdapter 对象并重写所需要的 4 个方法来实现所有页面的切换功能
PagerAdapter adapter = new PagerAdapter() { //创建适配器
@Override
public int getCount() { //获取页面个数
return viewList.size(); //返回页面数量
}
//确定页面视图是否与返回的对象相关联
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
//从视图容器中移除指定位置的页面
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
//返回当前所显示的视图
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return viewList.get(position);
}
};
public void onEnter(View view){ //第4个页面中按钮单击事件方法
//创建Intent跳转主界面中
Intent intent=new Intent(this,AmongFlipper.class);
startActivity(intent); //启动Intent
}
}