android中使用ViewPager实现无限轮播图

android中使用ViewPager实现无限轮播图

一、实现方式:

   1.通过ViewPager适配器中的getCount()方法添加一个整型最大的值来实现

   2.通过继承ViewPager重写ViewPager中的部分方法来实现

二、实现原理:

   上述的的方式一,其实可以理解成一种假的无限轮播,同时它太过野蛮也比较耗费资源,所以在这里我主要介绍第二种实现无线轮播图的方法。

原理展示图如下图所示:

这里写图片描述

三、代码实现

布局文件


  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.example.cycleviewpage.CycleViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        />

</LinearLayout>

java代码实现


package com.example.cycleviewpage;<br/>

import android.app.Activity;<br/>
import android.content.Context;<br/>
import android.os.Bundle;<br/>
import android.support.v4.view.PagerAdapter;<br/>
import android.support.v4.view.ViewPager;<br/>
import android.view.View;<br/>
import android.view.ViewGroup;<br/>
import android.widget.ImageView;<br/>

public class MainActivity extends Activity {

    private ViewPager vp;
    //四张图片资源id的整型数组
    private int[] ids = { R.drawable.a, R.drawable.b, R.drawable.c,
            R.drawable.d };
    private Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        vp = (ViewPager) findViewById(R.id.vp);
        //给vp设置适配器
        vp.setAdapter(new Adapter());
    }

    private class Adapter extends PagerAdapter {

        @Override
        public int getCount() {
            return ids.length ;
        }
        //初始化ViewPager中添加的内容
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView image = new ImageView(context);
            image.setBackgroundResource(ids[position]);
            container.addView(image);
            return image;
        }

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

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

自定义的无限轮播的CycleViewPager


package com.example.cycleviewpage;<br/>

import android.content.Context;<br/>
import android.os.Handler;<br/>
import android.support.v4.view.PagerAdapter;<br/>
import android.support.v4.view.ViewPager;<br/>
import android.util.AttributeSet;<br/>
import android.view.MotionEvent;<br/>
import android.view.View;<br/>
import android.view.ViewGroup;<br/>

public class CycleViewPager extends ViewPager {

    //创建一个Handler对象来实现图片的自动轮播
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            if (msg.what == 0) {
                //获取当前CycleViewPager展示的位置
                int currentItem = getCurrentItem();
                currentItem += 1;
                setCurrentItem(currentItem);
                //通过再次发送handler消息实现无线轮播图
                handler.sendEmptyMessageDelayed(0, 2000);
            }
        };
    };

    public CycleViewPager(Context context) {
        super(context);
    }

    public CycleViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    //重写ViewPager的监听方法,来实现在自定义控件内部的监听
    @Override
    public void setOnPageChangeListener(OnPageChangeListener listener) {
        InnerPageChangeListener innerListener = new InnerPageChangeListener(
                listener);
        super.setOnPageChangeListener(innerListener);
    }

    //重写ViewPager的setAdapter,来实现在自定义控件内部的自己添加适配器
    @Override
    public void setAdapter(PagerAdapter adapter) {
        //接收从外部来的Adapter,然后再对其进行再次的封装
        InnerPagerAdapter innerAdapter = new InnerPagerAdapter(adapter);
        super.setAdapter(innerAdapter);
        setOnPageChangeListener(null);
        setCurrentItem(1);
        startScroll();
    }

    private void startScroll() {
        handler.sendEmptyMessageDelayed(0, 2000);
    }

    private void stopScroll() {
        handler.removeMessages(0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        //在手指按下的时候让图片停止自动轮播
        case MotionEvent.ACTION_DOWN:
            stopScroll();
            break;
        case MotionEvent.ACTION_MOVE:
            break;
        //防止从ViewPager中滑动移除到其他控件的时候不执行ACTION_UP事件,从而无法实现图片的自动轮播
        case MotionEvent.ACTION_CANCEL:
        //手指抬起的时候再次发送handler消息,启动图片自动轮播的功能
        case MotionEvent.ACTION_UP:
            startScroll();
            break;
        }
        return super.onTouchEvent(ev);
    }

    private class InnerPageChangeListener implements OnPageChangeListener {

        private OnPageChangeListener listener;
        private int position;

        public InnerPageChangeListener(OnPageChangeListener listener) {
            this.listener = listener;

        }

        @Override
        public void onPageScrolled(int position, float positionOffset,
                int positionOffsetPixels) {
            if (listener != null) {
                listener.onPageScrolled(position, positionOffset,
                        positionOffsetPixels);
            }
        }

        @Override
        public void onPageSelected(int position) {
            this.position = position;
            if (listener != null) {
                listener.onPageSelected(position);
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            //判断ViewPager的滑动状态,当滑动状态变为空闲的时候再完成切换页面,能够给用户不突兀的感觉
            if (state == ViewPager.SCROLL_STATE_IDLE) {
                if (position == getAdapter().getCount() - 1) {
                    // 当图片滑动到最后一个位置的时候,将位置改变为A图片
                    position = 1;
                } else if (position == 0) {
                    // 当图片滑动到第一个位置的时候,将位置改变为D图片
                    position = getAdapter().getCount() - 2;
                }
            //false代表页面不平滑移动
                setCurrentItem(position, false);
            }
            if (listener != null) {
                listener.onPageScrollStateChanged(state);
            }
        }

    }

    private class InnerPagerAdapter extends PagerAdapter {

        private PagerAdapter adapter;

        public InnerPagerAdapter(PagerAdapter adapter) {
            this.adapter = adapter;
        }

        @Override
        public int getCount() {
            //在ViewPager的头部和尾部分别添加两个页面(***)
            return adapter.getCount() + 2;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if (position == getCount() - 1) {
                // 当图片滑动到最后一个位置的时候,将位置改变为A图片
                position = 0;
            } else if (position == 0) {
                // 当图片滑动到第一个位置的时候,将位置改变为D图片
                position = getCount() - 3;
            } else {
                position = position - 1;
            }
            return adapter.instantiateItem(container, position);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return adapter.isViewFromObject(view, object);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            adapter.destroyItem(container, position, object);
        }
    }
}

四、结果展示

这里写图片描述

源代码:https://github.com/Duckdan/CycleViewPager

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ViewPager实现轮播图需要以下步骤: 1. 在布局文件添加ViewPager控件。 2. 编写适配器Adapter,将图片加载到ViewPager。 3. 在Activity,实例化ViewPager和Adapter,并将Adapter设置给ViewPager。 4. 在Adapter,重写instantiateItem方法,返回加载的视图,并设置监听器,实现无限循环滚动效果。 5. 使用Handler和Runnable实现自动轮播功能。 以下是一个简单的示例代码: 1. 布局文件添加ViewPager控件: ``` <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="200dp" /> ``` 2. 编写适配器Adapter,将图片加载到ViewPager: ``` public class ViewPagerAdapter extends PagerAdapter { private Context context; private int[] images; public ViewPagerAdapter(Context context, int[] images) { this.context = context; this.images = images; } @Override public int getCount() { return images.length; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageResource(images[position]); container.addView(imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((ImageView) object); } } ``` 3. 在Activity,实例化ViewPager和Adapter,并将Adapter设置给ViewPager: ``` ViewPager viewPager = findViewById(R.id.viewPager); int[] images = {R.drawable.image1, R.drawable.image2, R.drawable.image3}; ViewPagerAdapter adapter = new ViewPagerAdapter(this, images); viewPager.setAdapter(adapter); ``` 4. 在Adapter,重写instantiateItem方法,返回加载的视图,并设置监听器,实现无限循环滚动效果: ``` @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageResource(images[position]); container.addView(imageView); // 设置监听器,实现无限循环滚动效果 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPosition = viewPager.getCurrentItem(); if (currentPosition == images.length - 1) { viewPager.setCurrentItem(0); } else { viewPager.setCurrentItem(currentPosition + 1); } } }); return imageView; } ``` 5. 使用Handler和Runnable实现自动轮播功能: ``` private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() { int currentPosition = viewPager.getCurrentItem(); if (currentPosition == images.length - 1) { viewPager.setCurrentItem(0); } else { viewPager.setCurrentItem(currentPosition + 1); } handler.postDelayed(this, 3000); } }; @Override protected void onResume() { super.onResume(); handler.postDelayed(runnable, 3000); } @Override protected void onStop() { super.onStop(); handler.removeCallbacks(runnable); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值