Android ViewPager学习总结

参考:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值