viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放
2015-01-06 16:26
513 查看
首先这里先声明引用了开源库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,图片直接在资源文件中,实际应用时应该是从网络获取。
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private static final int[] ids = {R.drawable.test1, R.drawable.test2, R.drawable.test3 };
public ImageAdapter(Context context) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return Integer.MAX_VALUE; //返回很大的值使得getView中的position不断增大来实现循环
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_item, null);
}
((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(ids[position%ids.length]);
return convertView;
}
}
复制代码
实现自动播放比较简单,我是通过发送延迟消息来实现的。收到延迟消息后再给自己发一条延迟消息。
//通过延迟消息实现自动播放,使用时通过调用该方法来启动自动播放功能
public void startAutoFlowTimer(){
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
snapToScreen((mCurrentScreen+1)%getChildCount());
Message message = handler.obtainMessage(0);
sendMessageDelayed(message, timeSpan);
}
};
Message message = handler.obtainMessage(0);
handler.sendMessageDelayed(message, timeSpan);
}
复制代码
效果图如下:
具体代码见demo,代码里我写的地方有注释。
demo:
许多朋友说有bug,我调试了一下,确实存在,这修改了一下,把bug修复了
新demo:
http://www.eoeandroid.com/thread-163018-1-1.html
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,图片直接在资源文件中,实际应用时应该是从网络获取。
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private static final int[] ids = {R.drawable.test1, R.drawable.test2, R.drawable.test3 };
public ImageAdapter(Context context) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return Integer.MAX_VALUE; //返回很大的值使得getView中的position不断增大来实现循环
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_item, null);
}
((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(ids[position%ids.length]);
return convertView;
}
}
复制代码
实现自动播放比较简单,我是通过发送延迟消息来实现的。收到延迟消息后再给自己发一条延迟消息。
//通过延迟消息实现自动播放,使用时通过调用该方法来启动自动播放功能
public void startAutoFlowTimer(){
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
snapToScreen((mCurrentScreen+1)%getChildCount());
Message message = handler.obtainMessage(0);
sendMessageDelayed(message, timeSpan);
}
};
Message message = handler.obtainMessage(0);
handler.sendMessageDelayed(message, timeSpan);
}
复制代码
效果图如下:
具体代码见demo,代码里我写的地方有注释。
demo:
许多朋友说有bug,我调试了一下,确实存在,这修改了一下,把bug修复了
新demo:
http://www.eoeandroid.com/thread-163018-1-1.html
相关文章推荐
- viewflow实现类似淘宝,网易新闻的横幅banner,可循环自动播放
- Android ViewPager实现Banner循环播放
- iOS实现自动循环播放的banner实例详解
- Android ViewPager banner 广告 循环 自动播放
- Android无限循环与自动播放ViewPager的简单实现(广告栏)
- 轮播banner,实现旋转木马效果,Galler 效果,可无限循环自动播放、拖拽
- Android之ViewPager自动循环播放(轮播)效果实现(超简单)
- 【安卓-自定义布局】安卓App开发思路 一步一个脚印(七)实现ViewPager无限循环与自动播放
- Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件
- Android 使用ViewPager实现图片左右循环滑动自动播放
- 自动循环切换图片的ViewPager,类似网页的广告页面切换
- Android HorizontalScrollView结合GridView实现类似网易新闻那样的栏目滑动效果
- 滚动视图(UIScrollView)无限无缝左右切换图片,自动顺序加逆序循环播放图片
- ios UIScrollView自动滚动 循环滚动视图实现
- UIScrollView 实现广告栏的无限轮播(可设置自动播放时间)
- IOS性能实现水平自动无缝循环LoopView(ScrollView)
- UI基础--使用UIScrollView、UIPageControl、NSTimer实现图片循环播放
- 动态生成Gallery控件组合实现无限循环自动播放广告图片效果总结
- UIScrollview实现左右循环滑动和自动轮播
- ViewPageIndicator + ViewPager + Fragment实现类似网易新闻客户端Tab标签