玩转ViewPager系列(一),从实现引导页说起

viewpager是android里一个非常常用的控件。之前项目用到的时候,我只是从网上找几篇文章复制粘贴就好,自己也没有好好研究,所以印象不深。这次有一些时间,决心好好研究一下,并把自己的心得分享给大家。

今天我们来一步步地实现引导页功能。首先,先准备4张图片和4个小圆点,用于轮播,把他们装到2个列表里。

        /**
         * 手动添加imageView
         */
        ImageView v1 = new ImageView(this);
        v1.setImageResource(R.drawable.img_avatar_01);
        v1.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v2 = new ImageView(this);
        v2.setImageResource(R.drawable.img_avatar_02);
        v2.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v3 = new ImageView(this);
        v3.setImageResource(R.drawable.img_avatar_03);
        v3.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v4 = new ImageView(this);
        v4.setImageResource(R.drawable.img_avatar_04);
        v4.setScaleType(ImageView.ScaleType.FIT_XY);

        datas.add(v1);
        datas.add(v2);
        datas.add(v3);
        datas.add(v4);

       /**
         * 手动添加小点点
         */
        circles.add(img1);
        circles.add(img2);
        circles.add(img3);
        circles.add(img4);

接着是重点,创建一个adapter继承pageradapter

    /**
     * 适配器
     */

    private class ImagePagerAdapter extends PagerAdapter{


        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
            return view==o;
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {

            Log.v("aaaaa","instantiateItem:"+position);

            if (datas.get(position).getParent()==null){
                container.addView(datas.get(position));

            }

            return datas.get(position);

        }


        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

//            Log.v("aaaaa","ondestory:"+position);
//            container.removeAllViews();

        }
    }

这里面要注意3个重写的方法。第一个是public boolean isViewFromObject,用来判断返回的是不是view。

第二个是 public Object instantiateItem 用来加载页面,通过打印位置我们发现,每一次不是初始化当前的页面,而是它的下一个页面,这是pagerAdapter的预加载机制,这里不做探讨。这里我们需要做个判断,对于已经加载过的页面,不能再用 container.addView(datas.get(position))方法,否则会报错。

第三个是public void destroyItem方法,我们可以在这里移除不需要的view来减少内存的占用,也可以什么都不写,这样原来加载的页面会一直存在,翻页也显得更加流畅自然。

给viewpager绑定adapter

 ViewPager pager = findViewById(R.id.viewpager);
 pager.setAdapter(new ImagePagerAdapter());

小圆点功能的实现

实现OnPageChangeListener接口,onPageSelected(int i)会返回当前位置,根据这个位置,调整4个小圆点颜色即可

 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {

                Log.v("aaaaa","position:"+i);
                clearstate();
                circles.get(i).setSelected(true);

            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

小圆点的xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:drawable="@drawable/circle1" android:state_selected="true">

    </item>


    <item android:drawable="@drawable/circle2" android:state_selected="false">

    </item>

</selector>

相信看到这里,大家已经有所了解了,最后附上完整代码

/**
 * created by desong 2020 02 07
 */

public class GuideActivity extends AppCompatActivity {


    List<ImageView> datas = new ArrayList<>();//4张图片集合

    ImageView img1,img2,img3,img4;//4张图片

    List<ImageView>circles = new ArrayList<>();//下面的小点点集合

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);


        img1 = findViewById(R.id.img1);
        img2 = findViewById(R.id.img2);
        img3 = findViewById(R.id.img3);
        img4 = findViewById(R.id.img4);

        /**
         * 手动添加imageView
         */
        ImageView v1 = new ImageView(this);
        v1.setImageResource(R.drawable.img_avatar_01);
        v1.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v2 = new ImageView(this);
        v2.setImageResource(R.drawable.img_avatar_02);
        v2.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v3 = new ImageView(this);
        v3.setImageResource(R.drawable.img_avatar_03);
        v3.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView v4 = new ImageView(this);
        v4.setImageResource(R.drawable.img_avatar_04);
        v4.setScaleType(ImageView.ScaleType.FIT_XY);

        datas.add(v1);
        datas.add(v2);
        datas.add(v3);
        datas.add(v4);

        img1.setSelected(true);

        /**
         * 手动添加小点点
         */
        circles.add(img1);
        circles.add(img2);
        circles.add(img3);
        circles.add(img4);


        ViewPager pager = findViewById(R.id.viewpager);
        pager.setAdapter(new ImagePagerAdapter());

        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {

                Log.v("aaaaa","position:"+i);
                clearstate();
                circles.get(i).setSelected(true);

            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });


    }

    /**
     * 适配器
     */

    private class ImagePagerAdapter extends PagerAdapter{


        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
            return view==o;
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {

            Log.v("aaaaa","instantiateItem:"+position);

            if (datas.get(position).getParent()==null){
                container.addView(datas.get(position));

            }

            return datas.get(position);

        }


        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

//            Log.v("aaaaa","ondestory:"+position);
//            container.removeAllViews();

        }
    }

    /**
     * 先清除所有圆点的选中状态
     */

    private void clearstate(){

        for (ImageView img:circles){

            img.setSelected(false);

        }

    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值