ViewPager轮播图

ViewPager: 轮播图

下面的ViewPager由LinearLayout,textView,点的容器组成;
 
ViewPager
页面切换,定时页面切换

VP技术点:

1、使用第三方UI类,只需要将完整包名加入就行
2、Timer和ScheduledExecutorService
3、Handler+Message或者runOnUiThread(runnable)更新界面ui
4、ViewPager的适配器类

VP步骤:

1、布局
##viewpager的使用方法
      注意:
1.首先在XML配置
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpager" />
 
2.把需要填充到ViewPager的View,先添加到ArrayList集合内(为了让PagerAdapter可以获取到需要填充的View)
思维形成:看到setAdapter就要想到List<数据类型>
ArrayList<View> list = new ArrayList<View>();
list.add(View.inflate(MainActivity.this, R.layout.layout1null));
list.add(View.inflate(MainActivity.this, R.layout.layout2null));
list.add(View.inflate(MainActivity.this, R.layout.layout3null));
list.add(View.inflate(MainActivity.this, R.layout.layout4null));  
 
ViewPager的步骤
1. 实现一个PagerAdapter的子类MyPagerAdapter。
2. 实现里面的4个方法。
3. getCount()返回当前的viewpager里面有几页。
4. isViewFromObject()内部优化的逻辑
        return view == object; //这个方法固定写法,其实可以不暴露出来的
 
5. 实现instantiateItem 实例化的逻辑,根据位置 返回view对象(否则报异常)
//为当前页面添加View
viewpager.addView(list.get(position));
return list.get(position);  
6. 实现destroyItem ,销毁view对象的逻辑( 把super 删除,否则也报异常)
//注意集合的数据是不可以删除的
viewpager.removeView(list.get(position));  
7. 生成apk的时候 记得配置 export 输入。

2、将要显示的图片,文字分别用int和String数组存起来
3、然后将布局中的显示的ImageView和显示的状态点分别存到一个ArrayList中去
4、设置viewpager的变化事件
5、在变化页面 onPageSelected中,将对应的文本标题和状态的点显示正确定时切换页面;
a)使用ScheduledExecutorService而不是Timer,
b)定时的切换,使用handler+Message更新界面
在Activity可见(onStart)时,开启定时,不可见时(onStop)时,关闭定时
可见时,将当前的item页面也增加1
@Override
protected void onStart() {
    super.onStart();
    scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
    Runnable command = new Runnable() {
        
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
 
                @Override
                public void run() {
                    // 将当前页面增加1,然后取余,为了保证最后一页可以循环到第一页page
                    currentItem = (currentItem + 1) % imageIds.length;
                    viewPager.setCurrentItem(currentItem);
                }
            });
        }
    };
    scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);
}
 
@Override
protected void onStop() {
    super.onStop();
    if (scheduledExecutorService != null) {
        scheduledExecutorService.shutdown();
    }
}

核心代码:

public class MainActivity extends Activity {
 
    private int imageIds[];
    private String descs[];
 
    private List<ImageView> images;
    private List<View> dots;
 
    private ViewPager viewPager;
    private PagerAdapter pagerAdapter;
 
    private TextView tv_desc;// 图片描述
 
    private int oldPosition = 0;// 记录切换页面前一个页面的位置
    private int currentItem;// 当前page的位置
 
    private ScheduledExecutorService scheduledExecutorService;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 1、图片资源id数组
        imageIds = new int[] {
            R.drawable.a,
            R.drawable.b,
            R.drawable.c,
            R.drawable.d,
            R.drawable.e
        };
 
        // 2、图片描述数组
        descs = new String[] {
            "巩俐不低俗,我就不能低俗",   
            "扑树又回来啦!再唱经典老歌引万人大合唱",   
            "揭秘北京电影如何升级",   
            "乐视网TV版大派送",   
            "热血屌丝的反杀"
        };
 
        // 3、要显示的ImageView集合
        images = new ArrayList<ImageView>();
        for (int imageId : imageIds) {
            ImageView iv = new ImageView(this);
            iv.setImageResource(imageId);
            images.add(iv);
        }
        // 4、要显示的状态点dot集合
        dots = new ArrayList<View>();
        dots.add(this.findViewById(R.id.dt1));
        dots.add(this.findViewById(R.id.dt2));
        dots.add(this.findViewById(R.id.dt3));
        dots.add(this.findViewById(R.id.dt4));
        dots.add(this.findViewById(R.id.dt5));
 
        // 初始化数据完毕----------------------
 
        tv_desc = (TextView) this.findViewById(R.id.tv_desc);
        tv_desc.setText(descs[0]);
 
        viewPager = (ViewPager) this.findViewById(R.id.view_pager);
        pagerAdapter = new MyPagerAdapter();
        viewPager.setAdapter(pagerAdapter);
        // viewPager.setCurrentItem(oldPosition);//设置当前显示的item
 
        // 设置viewPager的page改变事件
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 
            // 另外一张page被完全展示的时候,调用,参数代表当前page的位置,从0开始
            @Override
            public void onPageSelected(int position) {
                // System.out.println("onPageSelected:" + i);
 
                // 文字title改变
                tv_desc.setText(descs[position]);
 
                // 点dot改变,前一个位置变成normal,当前变成enabled
                dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
                dots.get(position).setBackgroundResource(R.drawable.dot_enable);
 
                // 更新上一个位置为当前位置
                oldPosition = position;
                currentItem = position;
            }
 
            // page在拖动的过程中,调用该方法
            @Override
            public void onPageScrolled(int i, float f, int j) {
                // System.out.println("onPageScrolled:");
            }
 
            // 只要状态一变化就调用,page滚动开始和结束时会调用,状态变化:1-2-0
            @Override
            public void onPageScrollStateChanged(int i) {
                // System.out.println("onPageScrollStateChanged:" + i);
            }
        });
    }
 

 pageadapter适配器

    private class MyPagerAdapter extends PagerAdapter {
        /**
         * viewpager的长度
         */

        @Override
        public int getCount() {
            return imageIds.length;
        }
 
        // 判断是同一个view
        /**
         * 判断滑动的控件和将要显示的控件是否为同一个 true 直接复用 false 会调用instantiateItem() 得到一个新的对象
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
 
        /**
         * 移除ImageView对象
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // super.destroyItem(container, position, object);//这个要注释掉
            // View view = container.getChildAt(position);
            // container.removeView(view);
            // container.removeViewAt(position);
            container.removeView(images.get(position));
        }
 
        /**
         * 得到一个Object对象就是ImageView
         */

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(images.get(position));
            return images.get(position);
        }
  }
 
    @Override
    protected void onStart() {
        super.onStart();
        scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
        Runnable command = new Runnable() {
 
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
 
                    @Override
                    public void run() {
                        // 将当前页面增加1,然后取余,为了保证最后一页可以循环到第一页page
                        currentItem = (currentItem + 1% imageIds.length;
                        viewPager.setCurrentItem(currentItem);
                    }
                });
            }
        };
        scheduledExecutorService.scheduleWithFixedDelay(command , 22, TimeUnit.SECONDS);
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdown();
        }
    }
}
 
 
 





posted @ 2015-10-07 14:07  林锐波  阅读(278)  评论(0编辑  收藏  举报