Indicatorview--輪播圖指示器

Android 封裝--IndicatorView--輪播圖指示器

作者:

使用場(chǎng)景

大多數(shù)App里都會(huì)有Banner輪播的效果,Android中實(shí)現(xiàn)此類功能一般是ViewPager配合Indicator指示器,實(shí)現(xiàn)滑動(dòng)效果,配合定時(shí)器實(shí)現(xiàn)自動(dòng)輪播及無限輪播效果,此類控件網(wǎng)上也有很多,最有名的要數(shù)JakeWharton大神的ViewPagerIndicator。
此處實(shí)現(xiàn)的簡(jiǎn)單的ViewPager和Indicator聯(lián)動(dòng)及自動(dòng)輪播,只有一個(gè)自定義View實(shí)現(xiàn)指示器功能,實(shí)現(xiàn)measure和layout,不需要太多的東西。

功能描述

通過自定義View實(shí)現(xiàn)Indicator的繪制及布局,提供設(shè)置ViewPager的方法,實(shí)現(xiàn)ViewPager與Indicator聯(lián)動(dòng),通過Handler發(fā)送延時(shí)任務(wù)實(shí)現(xiàn)自動(dòng)輪播,通過反射修改翻頁時(shí)間。提供自定義屬性設(shè)置默認(rèn)選中項(xiàng),指示器間距,以及指示器圖片資源。

  • 關(guān)聯(lián)ViewPager
/** @param realSize 實(shí)際數(shù)據(jù)大小,通過設(shè)置Integer.MAX_VALUE實(shí)現(xiàn)無限輪播,需要實(shí)際大小*/
public void setUpWithViewPager(ViewPager pager, int realSize) {
    this.viewPager = pager;
    pager.addOnPageChangeListener(this);
    PagerAdapter pagerAdapter = pager.getAdapter();
    if(pagerAdapter == null) {
        throw new RuntimeException("setAdapter must be call before");
    }
    if(pagerAdapter.getCount() <= 1) {
        this.setVisibility(GONE);
    } else {
        this.setVisibility(VISIBLE);
        setSelection(0);
    }
}
  • 修改翻頁時(shí)間
try {
    Field mField = ViewPager.class.getDeclaredField("mScroller");
    mField.setAccessible(true);
    FixedSpeedScroller mScroller = new FixedSpeedScroller(viewPager.getContext(), new AccelerateInterpolator());
    mField.set(viewPager, mScroller);
} catch (Exception e) {
    e.printStackTrace();
}
private static class FixedSpeedScroller extends Scroller {
        private int mDuration = 500;

        public FixedSpeedScroller(Context context) {
            super(context);
        }

        public FixedSpeedScroller(Context context, Interpolator interpolator) {
            super(context, interpolator);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            // Ignore received duration, use fixed one instead
            super.startScroll(startX, startY, dx, dy, mDuration);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy) {
            // Ignore received duration, use fixed one instead
            super.startScroll(startX, startY, dx, dy, mDuration);
        }

        public void setDuration(int time) {
            mDuration = time;
        }

    }
  • 布局中使用
<com.adinnet.widget.IndicatorView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:indicator="@mipmap/icon_delete"
    app:selection="1"
    app:interval="10dp"/>

添加依賴

  • 在Project的gradle添加倉庫地址
repositories {
//        jcenter()
    maven{url "http://10.40.255.100:8081/artifactory/libs-release-local"}
    maven{url "http://10.40.255.100:8081/artifactory/jcenter"}
}
  • 在主項(xiàng)目的gradle添加依賴
dependencies {
    compile 'com.adinnet.widget:indicatorview:1.0.0'
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評(píng)論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,176評(píng)論 22 665
  • 古風(fēng)美女
    YuKiNa醬閱讀 339評(píng)論 0 1
  • 開車也是一項(xiàng)技能,需要不斷精練。 上次開車似乎是半年前了,本就是新手,連實(shí)習(xí)期都還沒有過。 今天再次開車,狀況百出...
    瘦曉白閱讀 808評(píng)論 0 0
  • 2017年4月7日 星期五 晴天 今天晚上我媽媽上夜班,我爸爸留在家...
    晨晨_d5f3閱讀 222評(píng)論 0 2

友情鏈接更多精彩內(nèi)容