ViewPager轮播图

目前很多的电商类的APP首页都有这样的轮播图,所以在此提供本人的demo

1、先看看它的布局文件

这里还是挺简单的,就一个ViewPager和一个LinearLayout,LinearLayout是用来放那些小点的(指示器),这里要给它id这样方便对他进行操作。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="com.example.ws.myrecycleview.activity.ViewPagerLoopActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="224dp">

    </android.support.v4.view.ViewPager>

    <LinearLayout
        android:id="@+id/linear_dot"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/viewpager"
        android:layout_marginTop="2dp"
        android:orientation="horizontal"
        android:background="#ffdd00"
        android:gravity="center">

    </LinearLayout>

</RelativeLayout>
public class ViewPagerLoopActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    //放指示器的
    private LinearLayout mLinearLayout;
    //放图片资源的,我这里用的是本地的资源,根据需求自行修改
    private List<Integer> imageArray;
    //ViewPager中放的内容
    private ImageView[] imageViews;
    //适配器设置viewpager的
    private MyViewPagerAdapter adapter;

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

        init();

        adapter = new MyViewPagerAdapter();
        mViewPager.setAdapter(adapter);

        new Thread(new Runnable() {
            @Override
            public void run() {
                //循环播放
                while (true){
                    //3秒自动到下一张
                    SystemClock.sleep(3000);
                    //在主线程中去更新UI(该方法为把主线程请到子线程家里来)
                    runOnUiThread(new Runnable() {
                        public void run() {
                            int currentViewPager = mViewPager.getCurrentItem()+1;
                            //如果到了最后一张,让他返回显示第一张(关键)
                            if(currentViewPager == imageViews.length){
                                mViewPager.setCurrentItem(0);
                            }else {
                                mViewPager.setCurrentItem(currentViewPager);
                            }

                        }
                    });

                }

            }
        }).start();//别忘了start哈,否则没效果
    }

    private void init() {
        initViews();
        initDatas();
        initListeners();
    }

    private void initListeners() {
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
                    mLinearLayout.getChildAt(i).setEnabled(true);
                }
                mLinearLayout.getChildAt(position).setEnabled(false);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void initDatas() {
        imageArray = new ArrayList<>();
        imageArray.add(R.mipmap.image1);
        imageArray.add(R.mipmap.image2);
        imageArray.add(R.mipmap.image3);
        imageArray.add(R.mipmap.image4);

        imageViews = new ImageView[imageArray.size()];

        for (int i = 0; i < imageArray.size(); i++) {
            View dot = new View(this);
            dot.setBackgroundResource(R.drawable.dot_select);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(30, 30);
            params.leftMargin = 10;
            dot.setEnabled(false);
            dot.setLayoutParams(params);
            mLinearLayout.addView(dot);
            ImageView imageView_image = new ImageView(ViewPagerLoopActivity.this);
            imageView_image.setImageResource(imageArray.get(i));
            imageViews[i] = imageView_image;
        }

        for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
            mLinearLayout.getChildAt(i).setEnabled(true);
        }
        mLinearLayout.getChildAt(0).setEnabled(false);


    }

    private void initViews() {
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mLinearLayout = (LinearLayout) findViewById(R.id.linear_dot);
    }

    private class MyViewPagerAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return imageViews.length;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
        //要addView然后返回要显示的view,不要使用super的那个东东,会出错的
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(imageViews[position]);
            return imageViews[position];
        }
        //去掉super的那个东东,前面用了addView这里就要用removeView
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(imageViews[position]);
        }
    }
}

这里差不多就结束了,关键就是到最后时要让他回到第一个,还有就是让它循环,不停的动。

接下来提供几个drawable的资源

// 指示器的背景选择器dot_select

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_enabled="true" android:drawable="@drawable/dot_white"/>
    <item android:state_enabled="false" android:drawable="@drawable/dot_black"/>
</selector>

dot_white白点

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp"/>
    <solid android:color="#ffffff"/>
    <stroke android:color="#000000"
        android:width="1dp"/>
</shape>

dot_black黑点

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <corners android:radius="0.5dp"/>
    <solid android:color="#000000"/>
    <stroke android:color="#ffffff"
        android:width="1dp"/>
</shape>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值