本文最后更新于276 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
1.应用场景
- 引导界面,相册多图片预览
- 多Tab页面,App导航
- 广告播放展示
2.使用步骤
- 添加依赖
- xml布局中引用viewpager
- 声明数组,将图片存入
- 创建适配器,完成资源配置
3.案例
主布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pagers"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent">
</androidx.viewpager2.widget.ViewPager2>
<LinearLayout
android:id="@+id/dots"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="160dp"
android:orientation="horizontal">
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/dot_selected"/>
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/dot_unselected"/>
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/dot_unselected"/>
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/dot_unselected"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
dot_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#cccccc"/>
</shape>
dot_unselected.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#777777"/>
</shape>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Java代码:
package com.example.demo_4;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<Integer> pics = new ArrayList<>();
LinearLayout dots;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pics.add(R.mipmap.img1);
pics.add(R.mipmap.img2);
pics.add(R.mipmap.img3);
pics.add(R.mipmap.img4);
//实例化适配器
RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//此时用的布局是ViewPager每一页用来播放图片的布局
//该布局不设置任何空间,因为待会我们会直接将图片作为根布局的背景
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
return new ViewHolder(v);
}
//绑定 ViewHolder里面控件设置显示内容
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ViewHolder h = (ViewHolder) holder;
h.container.setBackgroundResource(pics.get(position));
}
@Override
public int getItemCount() {
return pics.size();
}
};
//找到ViewPager,设置适配器
ViewPager2 pagers = findViewById(R.id.pagers);
pagers.setAdapter(adapter);
dots = findViewById(R.id.dots);
pagers.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
for (int i=0;i<dots.getChildCount();i++){
//通过循环将现有所有的点设为未选中的状态
((ImageView)dots.getChildAt(i)).setBackgroundResource(R.drawable.dot_unselected);
}
//设置当前位置对应的点未选中的状态
((ImageView)dots.getChildAt(position)).setBackgroundResource(R.drawable.dot_selected);
}
});
}
public class ViewHolder extends RecyclerView.ViewHolder{
public LinearLayout container;
public ViewHolder(@NonNull View itemView) {
super(itemView);
container = itemView.findViewById(R.id.container);
}
}
}
同时,需要添加依赖:
implementation 'androidx.viewpager2:viewpager2:1.0.0'