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'
}