您的位置:首页 > 其它

开源一个基于ViewPager的无限轮循动画指示器

2016-05-18 10:29 363 查看



前言

在对自定义控件还模糊的时候,看到ViewPagerIndicatorandroid-auto-scroll-view-pager,决定自己做一个轮循效果的指示器。项目放在GitHub很久了,但一直都不完善,前段时间看到了AndroidImageSlider和CircleIndicator项目,又将自己的项目在功能性和健壮性上充实了下,目前还不支持直接从Gradle和Maven引入。

项目地址:https://github.com/lightSky/InfiniteIndicator


Screenshot





Demo
Download

APK Donwload

整个项目参考了一下几个项目:

android-auto-scroll-view-pager
AndroidImageSlider

CircleIndicator

Android-ViewPagerIndicator


Setting

setInterval(long)
轮循的间隔时间,单位为毫秒,默认为
2500
.
setDirection(int)
设置Page轮循的方向, 默认是
RIGHT
.
setInfinite(boolean)
是否启动轮询效果,默认是开启的.
setScrollDurationFactor(double)
Page的滑动速度
setStopScrollWhenTouch(boolean)
是否在用户触屏时,停止滑动,默认是停止滑动
setIndicatorPosition
设置Indicator的显示位置,共7种枚举
startAutoScroll()
启动轮循,间隔时间为
getInterval()
.
startAutoScroll(int)
启动轮循,同时传入间隔时间
stopAutoScroll()
停止轮循

Tip:为了防止内存泄露,及时释放资源,你应该在onPause和onResume中手动stop和start轮循

三种Indicator的枚举值

indicator_default 默认的指示器CircleIndicator
indicator_anim_circle 带动画的圆点指示器AnimCircleIndicator
indicator_anim_line is 带动画的line指示器AnimLineIndicator

后两种带动画的指示器实现方式是相同的,只是指示器的样式和动画效果不同,你可以参考AnimIndicator去自定义动画和样式,这里为了方便演示和使用,所以将它们作为枚举值独立了。

Indicator的实现方式

CircleIndicator:不支持动画,在ViewPagerIndicator的CircleIndicator上做了些更改,支持了轮循,考虑到轮循,因此只支持Snap效果的绘制。

AnimIndicator:支持动画,参考CircleIndicator项目。

图片加载
支持从本地加载以及从网络加载图片。图片下载使用了Picasso,你也可以使用ImageLoader进行替换。但需要你自己去修改。当图片加载失败时,当前Page会被remove掉,Indicator会做相应的刷新。

当只有一条数据时,Indicator默认不显示。

使用方式

<com.lightsky.infiniteindicator.InfiniteIndicatorLayout
android:id="@+id/indicator_default_circle"
app:indicator_type="indicator_anim_circle"
android:layout_height="wrap_content"
android:layout_weight="match_parent"/>


public class MainActivity extends Activity {
private InfiniteIndicatorLayout mDefaultIndicator;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDefaultIndicator = (InfiniteIndicatorLayout)findViewById(R.id.indicator_default_circle);
HashMap<String,String> url_maps = new HashMap<String, String>();
url_maps = new HashMap<String, String>();
url_maps.put("Page A", "https://raw.githubusercontent.com/lightSky/InfiniteIndicator/master/res/a.jpg");
url_maps.put("Page B", "https://raw.githubusercontent.com/lightSky/InfiniteIndicator/master/res/b.jpg");
url_maps.put("Page C", "https://raw.githubusercontent.com/lightSky/InfiniteIndicator/master/res/c.jpg");
url_maps.put("Page D", "https://raw.githubusercontent.com/lightSky/InfiniteIndicator/master/res/d.jpg");

for(String name : url_maps.keySet()){
DefaultSliderView textSliderView = new DefaultSliderView(this);
textSliderView
.image(url_maps.get(name))
.setScaleType(BaseSliderView.ScaleType.Fit)
.setOnSliderClickListener(this);
textSliderView.getBundle()
.putString("extra",name);
mDefaultIndicator.addSlider(textSliderView);
}
mDefaultIndicator.setIndicatorPosition(InfiniteIndicatorLayout.IndicatorPosition.Center_Bottom);
mDefaultIndicator.startAutoScroll();
}

@Override
protected void onPause() {
super.onPause();
mDefaultIndicator.stopAutoScroll();
}

@Override
protected void onResume() {
super.onResume();
mDefaultIndicator.startAutoScroll();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: