参考:
https://www.cnblogs.com/jzyhywxz/p/6914307.html
https://blog.csdn.net/IAFMAY/article/details/77981293
android-support-v4.jar是Google提供给我们用来兼容低版本Android系统的jar包,ViewPager正是其中之一。
第一步:添加依赖
implementation 'com.android.support:support-v4:25.3.0'
implementation 'com.github.bumptech.glide:glide:4.8.0'
最后的版本号可以搜索后再定,glide是一个非常强大的开源库,主要用于图片加载,在后面的例子中会用到。
第二步:在layout文件中添加VIewPager并获得其引用
layout文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".Activity_normal_viewPager">
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
第三步:为ViewPager设置适配器(最重要的一步)
ViewPager的适配器需要继承PagerAdapter并复写其中的几个方法:
public Object instantiateItem(ViewGroup container, int position):告诉pager adapter创建指定位置的列表项视图,然后将其添加给ViewGroup视图容器
public int getCount():返回pager的总数
public boolean isViewFromObject( View view, Object o):调用instantiateItem()创建完视图后,ViewPager会在某个时间点看到它。为确定视图所属的对象,ViewPager会调用isViewFromObject()方法
public void destroyItem(ViewGroup container, int position, Object object):销毁相应的pager
第四步:为pager添加进出的动画(可选)
pager的进出动画由setPageTransformer(boolean,Transformer)来定,参数Transformer是ViewPager类中的一个接口,需要实现其中的方法public void transformPage(View,float)。View表示视图,float表示视图的位置,范围[-1,1]。0代表完全可见,[-1,0)代表屏幕左边部分可见,(0,1]代表屏幕右边部分可见。下面是我Demo中的代码:
class MyTransformer implements ViewPager.PageTransformer{
private float MIN_SCALE = 0.75f;
@Override
public void transformPage(@NonNull View view, float position) {
if(position<-1){
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
}else if(position < 0){
view.setScaleX(1-Math.abs(position));
view.setScaleY(1-Math.abs(position));
}else if(position < 1){
view.setScaleX(1-position);
view.setScaleY(1-position);
}else{
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
}
}
}
****************************************************************************
//设置动画
pagers.setPageTransformer(true,new MyTransformer());
第五步:设置监听器(简单,略过)
下面是整个Demo:(activity文件)
package com.regon.viewpagerdemo;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
public class Activity_normal_viewPager extends AppCompatActivity {
private ViewPager pagers;
private List<View> datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_normal_viewpager);
pagers = (ViewPager)findViewById(R.id.container);
initData();
ViewAdapter myAdapter = new ViewAdapter(datas);
pagers.setAdapter(myAdapter);
pagers.setPageTransformer(true,new MyTransformer());
pagers.setListener
}
class ViewAdapter extends PagerAdapter{
List<View> list;
public ViewAdapter(List<View> viewList) {
super();
list = viewList;
}
@Override
public int getCount() {
return list.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view==o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = list.get(position);
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(list.get(position));
}
}
class MyTransformer implements ViewPager.PageTransformer{
private float MIN_SCALE = 0.75f;
@Override
public void transformPage(@NonNull View view, float position) {
if(position<-1){
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
}else if(position < 0){
view.setScaleX(1-Math.abs(position));
view.setScaleY(1-Math.abs(position));
}else if(position < 1){
view.setScaleX(1-position);
view.setScaleY(1-position);
}else{
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
}
}
}
private void initData(){
for(int i = 0;i < 5;i++){
View rootview = LayoutInflater.from(this).inflate(R.layout.layout_pager_item,null);
ImageView imageView = (ImageView)rootview.findViewById(R.id.image_item);
String path = "file:///android_asset"+"/images/"+i+".jpg";
Glide.with(this).
load(path).
into(imageView);
datas.add(rootview);
}
}
}
activity_layout_normal_viewpager.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".Activity_normal_viewPager">
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
layout_pager_item.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_item"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
上面的是一般的用法,当然也有特殊的情况,如果每一个ViewPager刚好是一个Fragment,Google提供了两种更易于实现的Adapter:FragmentStatePagerAdapter和FragmentPagerAdapter。二者只需要复写其中两个方法即可:
public int getCount() :返回视图总数
public Fragment getItem(int i) :返回需要展现的fragment视图
当然二者也有一些区别:FragmentStatePagerAdapter会自动销毁已经移出屏幕的视图,相反,FragmentPagerAdapter会保存所有的视图,因此,前者空间占优,后者时间占优,视情况而定。
FragmentStatePagerAdapter的Demo:
class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter{
private final int N = 5;
public MyFragmentStatePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Activity_FragmentPageAdapter.MyFragment myFragment = new Activity_FragmentPageAdapter.MyFragment();
Bundle bundle = new Bundle();
bundle.putString("index",i+"");
myFragment.setArguments(bundle);
return myFragment;
}
FragmentPagerAdapter的Demo:
class MyFragmentPageAdapter extends FragmentPagerAdapter{
private final int N = 5;
public MyFragmentPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return N;
}
@Override
public Fragment getItem(int i) {
Bundle bundle = new Bundle();
bundle.putString("index",i+"");
MyFragment myFragment = new MyFragment();
myFragment.setArguments(bundle);
return myFragment;
}
}
最后提一下与ViewPager相关的两个类:用于显示ViewPager的title
PagerTabStrip:PagerTabStrip is an interactive indicator of the current, next, and previous pages of a ViewPager
.
PagerTitleStrip:PagerTitleStrip is a non-interactive indicator of the current, next, and previous pages of a ViewPager
.