------------------------------------------------------------------------------
GitHub:lightSky
微博: light_sky , 即时分享最新技术,欢迎关注
------------------------------------------------------------------------------
前言
在对自定义控件还模糊的时候,看到ViewPagerIndicator和android-auto-scroll-view-pager,决定自己做一个轮循效果的指示器。项目放在GitHub很久了,但一直都不完善,前段时间看到了AndroidImageSlider和CircleIndicator项目,又将自己的项目在功能性和健壮性上充实了下,目前还不支持直接从Gradle和Maven引入。
项目地址:https://github.com/lightSky/InfiniteIndicator
Screenshot
Demo Download
整个项目参考了一下几个项目:
android-auto-scroll-view-pager
AndroidImageSliderCircleIndicator
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项目。
<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();
}
}