轮播图的简单实现

<span style="font-family: Arial, Helvetica, sans-serif;"> 
</span>

简单想一下,viewpager + handler(或者thread之类的线程)。无限轮播,解决了播放到最后,重复跳到第一页。有几点要注意 


一、首先看pagerAdapter的四个函数

<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">public MyAdapter(List<ImageView> pisc, String[] titles) {</span></span>
<span style="font-size:14px;">        this.pics = pisc;
        this.titles = titles;
    }

    @Override
    public int getCount() {
        if (pics != null) {
            return Integer.MAX_VALUE; // <span style="color: rgb(0, 153, 0);">返回一个没有边界的数值,用于无限轮播</span>
        }
        return 0;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (position < 0) {
            position = pics.size() + position;
        }
        View iv = pics.get(position % pics.size());
        ViewGroup parent = (ViewGroup) iv.getParent();
        if (parent != null) {
            parent.removeView(iv);     // <span style="color: rgb(0, 153, 0);">这里容易出错,稍稍处理了一下</span>
        }
        container.addView(iv);

        return iv;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(pics.get(position % pics.size()));
    }</span>

二、设置viewpager

 <span style="white-space:pre">	</span><span style="font-size:14px;">arrayList = new int[]{R.mipmap.a, b, R.mipmap.c};</span>
<span style="font-size:14px;">
        for (int i = 0; i < arrayList.length; i++) {
            ImageView iv = new ImageView(this);
            iv.setScaleType(ImageView.ScaleType.FIT_XY);
            iv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200));
            iv.setImageResource(arrayList[i]);
            pics.add(iv);</span>
<span style="font-size:14px;">
</span>
<span style="font-size:14px;"><span style="white-space:pre">	</span>   //以下是处理 指示器的小圆点,代码会在底部给出</span>
<span style="font-size:14px;">            View pointView = new View(this);
            pointView.setBackgroundResource(R.drawable.point_selector);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15);
            params.leftMargin = 5;
            pointView.setLayoutParams(params);
            pointView.setEnabled(false);
            ll.addView(pointView);
        }

        vp.setAdapter(new MyAdapter(pics, titles));
        currentPos = Integer.MAX_VALUE / 2 + (Integer.MAX_VALUE / 2 % pics.size()); <span style="color:#009900;">//为了轮播图能够平稳的过度,让轮播图可以左右滑动。 </span></span>
<span style="font-size:14px;"><span style="color:#009900;"><span style="white-space:pre">											</span>// 这里如果位置不对可试试  减号。</span>
        vp.setCurrentItem(currentPos); 
        ll.getChildAt(0).setEnabled(true);
        cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY); // 开始发送消息轮播</span>


三、handler的处理
 <span style="font-size:14px;">public Handler cirPicHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_UPDATE: // 更新
                    currentPos++;
                    vp.setCurrentItem(currentPos);
                    cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
                    break;
                case MSG_STOP://停止
                    break;
                case MSG_RESUME://重新开始
                    cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
                    break;
                case MSG_PAGE://记录当前的位置
                    currentPos = msg.arg1;
                    break;
            }
        }
    };</span>

四、viewpager的事件处理

<span style="font-size:14px;">vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                ll.getChildAt((position - 1) % arrayList.length).setEnabled(false);//回复上一点
                ll.getChildAt(position % arrayList.length).setEnabled(true); //选中当前点
                 cirPicHandler.sendMessage(Message.obtain(cirPicHandler, MSG_PAGE,position,0));
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                          cirPicHandler.sendEmptyMessage(MSG_STOP);  //拖动的时候 什么也不处理
                        break;
                    case ViewPager.SCROLL_STATE_IDLE:
                        break;
                }
            }
        });</span>

五、小圆点的绘制

1.point_enable

<span style="font-size:14px;"><shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <size
        android:width="10dp"
        android:height="10dp" />
    <solid android:color="#88ffffff" />
    <padding android:left="2dp"/>
</shape></span>
2.point_normal

<span style="font-size:14px;"><shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <size android:height="10dp"
        android:width="10dp"/>
    <corners android:radius="5dp"/>
    <solid android:color="#33000000"/>
</shape></span>

3.写一个selector:point_selector

<span style="font-size:14px;"><selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/points_normal"/>
    <item android:state_enabled="true" android:drawable="@drawable/point_enable"/>
</selector></span>


至此全部的内容完毕,个人觉得处理时不会让用Integer.MAX_VALUE这个属性,怎么让轮播如左右都可以滑动。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值