viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放

首先这里先声明引用了开源库viewflow,我这里只用了其中的ViewFlow和CircleFlowIndicator。想对viewflow有更多了解的可以去github下载viewflow开源包。
viewflow本身还没有实现循环和自动播放功能。我这里在viewflow源码的基础上加了点代码以实现这两个功能。
说viewflow没有实现循环这话不太对,其实要看你的adapter怎么写。因为viewflow是AdapterView。
要实现viewflow循环,你的adapter的getcount方法要返回一个很大的值,例如Integer.Max_value。然后在getview方法中,由于position不断递增,可以通过取余数来实现。Positon%length
length为你图片实际的张数。例如我有3张图片,那么position=3显示的是第一张图片,跟position=0一样。最后在activity中初始化viewflow adapter位置。如果你不设置 position=0是不能向左的,因为position不能小于0。可以调用viewflow.setSelection(3*1000); 设置的数值是你图片张数的整数倍,这样显示的还是第一张。(这样看起来就循环了,既可以向左,也可以向右,从第一张可以向左跳到最后一张,从最后一张可以向右回到第一张。。。)
我写的ImageAdapter,图片直接在资源文件中,实际应用时应该是从网络获取。
  1. public class ImageAdapter extends BaseAdapter {

  2.         private LayoutInflater mInflater;
  3.         private static final int[] ids = {R.drawable.test1, R.drawable.test2, R.drawable.test3 };

  4.         public ImageAdapter(Context context) {
  5.                 mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  6.         }

  7.         @Override
  8.         public int getCount() {
  9.                 return Integer.MAX_VALUE;   //返回很大的值使得getView中的position不断增大来实现循环
  10.         }

  11.         @Override
  12.         public Object getItem(int position) {
  13.                 return position;
  14.         }

  15.         @Override
  16.         public long getItemId(int position) {
  17.                 return position;
  18.         }

  19.         @Override
  20.         public View getView(int position, View convertView, ViewGroup parent) {
  21.                 if (convertView == null) {
  22.                         convertView = mInflater.inflate(R.layout.image_item, null);
  23.                 }
  24.                 ((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(ids[position%ids.length]);
  25.                 return convertView;
  26.         }

  27. }
复制代码


实现自动播放比较简单,我是通过发送延迟消息来实现的。收到延迟消息后再给自己发一条延迟消息。      
  1. //通过延迟消息实现自动播放,使用时通过调用该方法来启动自动播放功能
  2.         public void startAutoFlowTimer(){
  3.                 handler = new Handler(){
  4.                         @Override
  5.                         public void handleMessage(Message msg) {
  6.                                 
  7.                                 snapToScreen((mCurrentScreen+1)%getChildCount());
  8.                                 Message message = handler.obtainMessage(0);
  9.                                 sendMessageDelayed(message, timeSpan);
  10.                         }
  11.                 };

  12.                 Message message = handler.obtainMessage(0);
  13.                 handler.sendMessageDelayed(message, timeSpan);
  14.         }
复制代码



效果图如下:
viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放_第1张图片 viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放_第2张图片 viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放_第3张图片
2012-3-27 11:55 上传
下载附件 (21.45 KB)
viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放_第4张图片
2012-3-27 11:55 上传
下载附件 (25.26 KB)
viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放_第5张图片

你可能感兴趣的:(viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放)