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

------------------------------------------------------------------------------

   GitHub:lightSky

   微博:    light_sky , 即时分享最新技术,欢迎关注

------------------------------------------------------------------------------


前言

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


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

Screenshot

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();
        }
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值