Android ViewPager+轮播图

Posted 彬sir哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android ViewPager+轮播图相关的知识,希望对你有一定的参考价值。

1.实现轮播图(可点击事件)效果如下:


2.做的项目如下图:
在这里插入图片描述
3.实现目标

  • 可以自动轮播(无限循环)
  • 可以手动左右滚动
  • 自定义性强

4.activity_main.xml,布局代码如下:

    <FrameLayout
        android:id="@+id/fl_vp"
        android:layout_width="match_parent"
        android:layout_height="150dip"
        android:visibility="gone">
        <!--轮播图-->
        <android.support.v4.view.ViewPager
            android:id="@+id/vp"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|bottom"
            android:orientation="vertical">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:lines="1"
                android:textColor="@android:color/white" />

            <LinearLayout
                android:id="@+id/item_home_picture_container_indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_below="@id/title"
                android:layout_marginBottom="3dp"
                android:layout_marginRight="20dp"
                android:layout_marginTop="3dp"
                android:orientation="horizontal">

            </LinearLayout>
        </RelativeLayout>
    </FrameLayout>

5.MainActivity.java,代码如下:
5.1 给容器添加三个小点,第一个小黑点是默认的,第二、三是小白点

        // 给容器添加点
        mPointContainer.removeAllViews();
        for (int i = 0; i < 3; i++) {
            View v = new View(this);
            v.setBackgroundResource(R.drawable.indicator_selected);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(UIUtils.dip2px(6), UIUtils.dip2px(6));// dp
            // -->
            // px
            if (i != 0) {
                params.leftMargin = UIUtils.dip2px(8);
                params.bottomMargin = UIUtils.dip2px(8);
            } else {
                v.setBackgroundResource(R.drawable.indicator_normal);// 设置默认选中
            }
            mPointContainer.addView(v, params);

5.2 MAX_VALUE / 3、middle % 3表示第一个小黑点是默认的

        // 给ViewPager设置中间选中的值
        int middle = Integer.MAX_VALUE / 3;
        int extra = middle % 3;
        mViewPaper.setCurrentItem(middle - extra);

5.3 轮播图延迟时间,看看下面理解

    //自动播放广告栏任务
    class AutoSwitchTask implements Runnable {
        // 开始轮播
        public void start() {
            stop();
            UIUtils.postDelayed(this, 10000);//“10000”表示轮播图的第一图片开始延迟时间后轮播
        }

        // 停止轮播
        public void stop() {
            UIUtils.removeCallbacks(this);
        }

        @Override
        public void run() {
            // 让ViewPager选中下一个
            int item = mViewPaper.getCurrentItem();
            mViewPaper.setCurrentItem(++item);
            UIUtils.postDelayed(this, 5000);//“5000”表示每一个图片延迟时间后轮播
        }
    }

5.4 给容器添加三个轮播图,看看下面理解

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position = position % 3;//三个轮播图
            ImageView iv = new ImageView(MainActivity.this);
            iv.setScaleType(ImageView.ScaleType.FIT_XY);
            // 给iv设置数据
            iv.setImageResource(R.drawable.image1);// 设置默认图片
            // 设置网络图片
            if (position == 0) {
                iv.setImageResource(R.drawable.image1);//第一个轮播图
//                BitmapHelper.display(iv,R.drawable.image1 );
            } else if (position == 1){
                iv.setImageResource(R.drawable.image2);//第二个轮播图
            }else {
                iv.setImageResource(R.drawable.image3);//第三个轮播图
            }
//            BitmapHelper.display(iv, AppConfig.IMAGE_BASE_URL + roastingDatas.get(position).get("ID"));
            final int finalPosition = position;
            iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    roastingPictureClick(finalPosition);
                }
            });
            // 给viewpager加视图
            container.addView(iv);
            return iv;
        }

5.5 轮播图点击事件,代码如下:

    //轮播图点击
    private void roastingPictureClick(int position) {
        Toast.makeText(this, "轮播图点击:" + position, Toast.LENGTH_SHORT).show();
    }

在这里插入图片描述
5.6 三个小点,一个小黑点,二个小白点

@Override
    public void onPageSelected(int position) {
        // 页面选中时
        position = position % 3;
        int count = mPointContainer.getChildCount();
        for (int i = 0; i < count; i++) {
            View view = mPointContainer.getChildAt(i);
            view.setBackgroundResource(i == position ? R.drawable.indicator_normal//黑点
                    : R.drawable.indicator_selected);//白点
        }
    }

在这里插入图片描述
6.源代码下载:
https://download.csdn.net/download/qq_35091074/19697222

以上是关于Android ViewPager+轮播图的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义控件5--轮播图广告ViewPager基本实现

ViewPager详解广告轮播图

ViewPager详解广告轮播图

Android 使用ViewPager和自定义PagerAdapter实现轮播图效果

自定义完美的ViewPager 真正无限循环的轮播图

Android侧滑菜单和轮播图之滑动冲突