轮播图的简单实现

来源:互联网 发布:matlab2016a破解版mac 编辑:程序博客网 时间:2024/06/03 21:33

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

前言: 天长地久。天地所以能长且久者,以其不自生,故能长生。是以圣人后其身而身先,外其身而身存。非以其无私邪?故能成其私。


       有句话:不要重复的造轮子。但是如果我们连轮子怎么实现的都不知道,那就说不过去了。所以东西还是要去学习。这几天也把viewpager学习了一下,接下来做一个轮播图的实现过程,可能不是那么专业,只是个记录。


简单想一下,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
原创粉丝点击