使用ViewPager实现广告轮播图效果

1、杂谈

作为一名始终走在it路上的菜鸟,走上Android这条路有 很长一段时间了,但是总是感觉自己太笨,技术总是会了新的就忘了旧的……以前总是喜欢看别人写博客,自己不太喜欢动手写,因为最近都有在学别的知识和技术,害怕自己弄混乱,同时也为了巩固Android,(不能丢了吃饭的家伙不是)。。。从这篇开始走上博客之路啦

我始终相信:努力一定是有回报的,好奇心很重要,三分钟热度和懒惰以及“明日复明日”的想法不可要……<

2、概述及思路

(1)概述
现在接触到的好多项目都有轮播图效果,也有很多不同的实现方式,在这里记录一下自己的实现之路

所要实现的效果:
- 添加图片(这里不从网络取了)
- 轮播图上添加点
- 实现轮播图的自动跳转

嗯,虽然可能实现起来比较简单,但是技术不都是从简单开始的么,罗马不是一天建成的。。。。

(2)思路

轮播图实现肯定是离不开viewpager的,根据现在的需求,需要添加图片,同时我们需要添加点,并且点的数目要和图片的数目刚好相等,虽然viewpager本身就有滑动效果,但是我们需要的是它自动跳转,所以这里我用handler发送延迟消息来实现,最后要解决事件分发的滑动冲突问题

3、代码实现

一、主界面(我是在fragment中写的)
(1)布局(部分代码)

   <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:padding="10dp"
        >

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

        <LinearLayout
            android:id="@+id/container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerInParent="true"
            android:orientation="horizontal"
            android:paddingBottom="7dp"
            >
        </LinearLayout>

    </RelativeLayout>

(2)初始化布局

    //放轮播图片
    private int[]           imageUrls = {R.mipmap.pic1,R.mipmap.run,R.mipmap.yundong};
    //放轮播图片的ImageView 的 list
    public  List<ImageView> imageViewsList;
    //放圆点的View的list
    public  List<View>      dotList;   
    private ViewPager mHeadViewPager;
    //用来布局点的(水平)
    private LinearLayout mContainer;


//首先需要拿到我们需要的控件
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        initToolbar(view);
    //这用来进行viewpager的操作
        initHeadVp(view);

        //TODO   需要从服务器拿数据,这里先用假的数据
        initViewPagerData();

    //在这个方法中进行点布局
        initUI();
    }

(3)

    public void initViewPagerData() {
        imageViewsList = new ArrayList<ImageView>();
        dotList=new ArrayList<View>();

        //TODO 异步任务获取图片(预留)
    }

(4)initUi,在这个方法中,我用来去判断图片的个数,然后去new 相同个数的点(dotView )

    private void initUI() {

        if (imageUrls == null || imageUrls.length == 0)
            return;

        //热点个数与图片个数相等
        for (int i = 0; i < imageUrls.length; i++) {
            ImageView view = new ImageView(getContext());
            view.setTag(imageUrls[i]);
            view.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageViewsList.add(view);

            ImageView dotView = new ImageView(getContext());
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);

    //点与点之间的间距
            params.leftMargin = 4;
            params.rightMargin = 4;
            //将点添加进  LinearLayout中
            mContainer.addView(dotView,params);
            dotList.add(dotView);
        }

        mHeadViewPager.setFocusable(true);

        //给vp添加适配器,将图片,imageview集合作为参数传递
        mHeadViewPager.setAdapter(new HeadViewPagerAdapter(imageUrls, imageViewsList, getActivity()));
        //给vp设置当前位置
        mHeadViewPager.setCurrentItem(imageViewsList.size() * 10000);
        //在这里我用了监听,监听vp的page变化,当page变化时,我们的点的背景也要不同
        mHeadViewPager.setOnPageChangeListener(new HeadViewPagerChangeListener(imageViewsList, dotList));

        //延时2秒更新广告条的消息
        mHandler.sendEmptyMessageDelayed(0,3000);
        }

(5)适配器 HeadViewPagerAdapter

public class HeadViewPagerAdapter extends PagerAdapter {

    public static int             pos;
    private       int[]           imageUrls;
    private       List<ImageView> imageViewsList;
    private       Context         mContext;

    public HeadViewPagerAdapter(int[] imageUrls, List<ImageView> imageViewsList, Context context) {
        this.imageUrls = imageUrls;
        this.imageViewsList = imageViewsList;
        this.mContext = context;
    }

    @Override
    public int getCount() {
    //这里使用integer的最大值
        return Integer.MAX_VALUE;
    }

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


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

    //因为我们设置的position在0-imageViewsList.size() * 10000之间,取余可以实现在0-imageViewsList.size() -1之间
        pos = position % imageViewsList.size();
        ImageView imageView = imageViewsList.get(pos);
        //这是加载图片的开源        Picasso.with(context).load((imageUrls[pos]).getAdvImg()).into(imageView);
        imageView.setImageResource(imageUrls[pos]);
        ((ViewPager)container).addView(imageView);
        return imageViewsList.get(pos);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        pos = position % imageViewsList.size();
        ((ViewPager)container).removeView(imageViewsList.get(pos));
    }
}

(6)HeadViewPagerChangeListener
在这里实现点的移动

public class HeadViewPagerChangeListener implements ViewPager.OnPageChangeListener{

    private List<ImageView> mImageViewList;
    public int mPreviousPos;//上一个页面位置
    private List<View> dotList;

    public HeadViewPagerChangeListener(List<ImageView> imageViewsList, List<View> dotList) {
        this.mImageViewList = imageViewsList;
        this.dotList = dotList;
    }


//这里主要的方法
    @Override
    public void onPageSelected(int position) {

        int pos = position % mImageViewList.size();
        for (int i = 0;i<dotList.size();i++){
            if (i == pos){
                dotList.get(pos).setBackgroundResource(R.mipmap.hint_point_enable);
            }else{
                dotList.get(i).setBackgroundResource(R.mipmap.hint_point);
            }
        }

        //更新上一个页面位置
        mPreviousPos = pos;

    }

(7 )自动跳转
这里是实现自动跳转的最主要代码

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            int currentItem = mHeadViewPager.getCurrentItem();
            mHeadViewPager.setCurrentItem(++currentItem);

            //继续发送延时2秒的消息,形成类似递归的效果。
            mHandler.sendEmptyMessageDelayed(0, 3000);

        }
    };

(8)解决事件冲突
在initUi方法中

 mHeadViewPager.setOnTouchListener(new View.OnTouchListener(){

            private long downTime;
            private int downX;

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        mHandler.removeCallbacksAndMessages(null);
                        downX = (int) event.getX();
                        downTime = System.currentTimeMillis();
                        break;
                    case MotionEvent.ACTION_UP:
                        // 考虑到手按下和抬起时的坐标不可能完全重合,这里给出30的坐标偏差
                        if (System.currentTimeMillis() - downTime < 500&& Math.abs(downX - event.getX()) < 30){
                            //点击操作
                        }
                        //继续轮播广告
                        mHandler.sendEmptyMessageDelayed(0,3000);
                        break;
                }

                return false;
            }
        });

到此我们的功能就实现了
Android第一篇,问题肯定不少,但却能是自己更脚踏实地,为了自己在it之路上走的更远和不断进步……不管以后谁会看到,都希望我们能会越来越好,而不是“从入门到放弃……哈哈哈【表情】”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值