我们经常可以看见轮播的控件,轮播的控件本质上讲是ViewPager 和 Scroller 组合起来的控件,也可以使用LoopViewPager 使用。我们先看一种
先上代码ViewPager 和 Scroller 组合起来 的方式
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import android.widget.Scroller;
import java.lang.reflect.Field;
public class CarouselFigureView extends FrameLayout implements OnPageChangeListener, IFloorFigureView {
private static final String TAG = "CarouselFigureView";
private Context mContext;
private int bannerCornerRadius;
/**
* 轮播图自动切换时间
*/
private static final int VIEW_CHANGE_INTERVAL = 2000;
private static final int VIEW_CHANGE_INTERVAL_RESUME = 2000;
/**
* 轮播图容器
*/
protected CarouselFigureViewPager pager;
/**
* 标记
*/
protected String id;
/**
* 游标容器
*/
private ICursorCtrl mCursorContentViewCtrl;
/**
* 自动更新Viewpager的令牌
*/
private long token = -1;
/**
* 是否轮播
*/
private boolean isCarousel;
/**
* 是否自动播放
*/
private boolean isAutoPlay;
/**
* 页面是否不再当前显示了
*/
private boolean isPause;
/**
* 增加字段控制,detach后停止自动轮播,onDetachedFromWindow不再清除所有消息
* 原因是部分手机RecyclerView在绘制看不见的楼层后会触发onDetachedFromWindow,导致setAdapter失败
*/
private boolean isDetached;
private int scrollDuration;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (isPause) {
return;
}
if (isDetached) {
return;
}
if (pager == null || pager.getChildCount() <= 1 || null == pager.getAdapter() || pager.getAdapter().getCount() < 2) {
return;
}
long tag;
try {
tag = (Long) msg.obj;
} catch (Exception e) {
return;
}
if (token - tag != 0) {
return;
}
int position = msg.what;
if (isCarousel) {
if (position == 0 && pager.getCurrentItem() != 0) {
pager.setCurrentItem(pager.getRealCount() + 1);
} else if (position == pager.getRealCount() + 1) {
pager.setCurrentItem(2);
} else {
pager.setCurrentItem(position + 1);
}
} else {
pager.setCurrentItem((position + 1) % pager.getAdapter().getCount());
}
}
};
public CarouselFigureView(Context context) {
super(context);
}
public CarouselFigureView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 初始化轮播图和游标
*
* @param context
* @param parent 父滚动控件
* @param pagerHeight 整体高度
* @param isCarousel 是否轮播
* @param isAutoPlay 是否自动播放
* @param cursorMarginBottom 游标底部的间距(小于或等于0使用默认值)
*/
public void init(Context context, ViewGroup parent, int pagerHeight, boolean isCarousel, boolean isAutoPlay, int cursorMarginBottom) {
mContext = context;
this.isCarousel = isCarousel;
this.isAutoPlay = isAutoPlay;
// 初始化轮播图
if (pager == null) {
pager = new CarouselFigureViewPager(mContext);
LayoutParams pagerParams = new LayoutParams(LayoutParams.MATCH_PARENT, pagerHeight);
pagerParams.setMargins(0, 0, 0, 0);
pager.setLayoutParams(pagerParams);
// 设置轮播图的翻页监听
pager.setOnPageChangeListener(this);
addView(pager);
}
//初始化游标
if (mCursorContentViewCtrl != null) {
mCursorContentViewCtrl.removeCursor();
mCursorContentViewCtrl.initCursorContentView(getContext(), pager.getId());
mCursorContentViewCtrl.onPageSelected(0);
mCursorContentViewCtrl.setCurrentCursorPosition(0);
}
pager.init(parent, isCarousel);
}
public void setCursorCtrl( ICursorCtrl cursorCtrl){
mCursorContentViewCtrl = cursorCtrl;
}
/**
* 初始化轮播图和游标(开启轮播,自动播放)
*
* @param context
* @param parent 父滚动控件
* @param pagerHeight 整体高度
*/
public void init(Context context, ViewGroup parent, int pagerHeight) {
this.init(context, parent, pagerHeight, true, true, 0);
}
public void init(Context context, ViewGroup parent, int pagerHeight, boolean isCarousel, boolean isAutoPlay, int cursorMarginBottom, int scrollDuration) {
init(context, parent, pagerHeight, isCarousel, isAutoPlay, cursorMarginBottom, scrollDuration, true);
}
public void init(Context context, ViewGroup parent, int pagerHeight, boolean isCarousel, boolean isAutoPlay, int cursorMarginBottom, int scrollDuration, boolean useCustomScroller) {
this.scrollDuration = scrollDuration;
this.init(context, parent, pagerHeight, isCarousel, isAutoPlay, cursorMarginBottom);
if (scrollDuration > 0 && useCustomScroller) {
ViewPagerScroller scroller = new ViewPagerScroller(context);
scroller.setScrollDuration(scrollDuration);
scroller.initViewPagerScroll(pager);
}
}
/**
* 绑定数据Adapter
*
* @param adapter
*/
public void setAdapter(PagerAdapter adapter) {
if (null != adapter) {
pager.setAdapter(adapter);
if (mCursorContentViewCtrl != null) {
mCursorContentViewCtrl.createCursor(pager.getRealCount(), CarouselFigureView.this, pager.toRealPosition(pager.getCurrentItem()));
}
autoChangeViewPagerPosition(VIEW_CHANGE_INTERVAL + this.scrollDuration);
}
}
public void setId(String id) {
this.id = id;
}
public void setPagerPadding(int left, int right, int top, int bottom) {
if (null != pager) {
pager.setPadding(left, right, top, bottom);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (null != mCursorContentViewCtrl) {
mCursorContentViewCtrl.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
}
@Override
public void onPageSelected(int position) {
if (mCursorContentViewCtrl != null) {
mCursorContentViewCtrl.onPageSelected(position);
mCursorContentViewCtrl.setCurrentCursorPosition(position);
}
autoChangeViewPagerPosition(VIEW_CHANGE_INTERVAL + this.scrollDuration );
}
/**
* 自动轮播
*/
private synchronized void autoChangeViewPagerPosition(int interval) {
if (pager == null || !isAutoPlay) {
return;
}
token = System.currentTimeMillis();
Message message = Message.obtain();
message.what = pager.getCurrentItem();
message.obj = token;
handler.sendMessageDelayed(message, interval);
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void onPause() {
token = System.currentTimeMillis();
isPause = true;
}
public void onResume() {
isPause = false;
autoChangeViewPagerPosition(VIEW_CHANGE_INTERVAL_RESUME);
}
public void toFirstItem() {
post(new Runnable() {
@Override
public void run() {
if (null == pager || null == pager.getAdapter()) {
return;
}
if (pager.getAdapter().getCount() > 1 && isCarousel) {
pager.setCurrentItem(1, false);
} else {
pager.setCurrentItem(0, false);
}
}
});
}
/**
* 只有图片的轮播图,设置回调
*
* @param listener
*/
@Override
public void setCarouseFigureImageAdapterListener(final CarouseFigureImagePagerAdapter.CarouseFigureImageAdapterListener listener) {
if (null != pager && null != listener) {
if (Looper.myLooper() != Looper.getMainLooper()) {
handler.post(new Runnable() {
@Override
public void run() {
setCarouseFigureImagePagerAdapter(listener);
}
});
} else {
setCarouseFigureImagePagerAdapter(listener);
}
}
}
private void setCarouseFigureImagePagerAdapter(CarouseFigureImagePagerAdapter.CarouseFigureImageAdapterListener listener) {
pager.setAdapter(new CarouseFigureImagePagerAdapter(mContext, isCarousel, bannerCornerRadius, listener));
if (mCursorContentViewCtrl != null) {
mCursorContentViewCtrl.createCursor(pager.getRealCount(), CarouselFigureView.this, pager.toRealPosition(pager.getCurrentItem()));
}
autoChangeViewPagerPosition(VIEW_CHANGE_INTERVAL + this.scrollDuration);
}
@Override
protected void onAttachedToWindow() {
isDetached = false;
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
isDetached = true;
super.onDetachedFromWindow();
// handler.removeCallbacksAndMessages(null);
}
public class ViewPagerScroller extends Scroller {
private int mScrollDuration = 2000;
public ViewPagerScroller(Context context) {
super(context);
}
public ViewPagerScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
/**
* 设置速度速度
*
* @param duration
*/
public void setScrollDuration(int duration) {
this.mScrollDuration = duration;
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
public void initViewPagerScroll(ViewPager viewPager) {
try {
Field mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
mScroller.set(viewPager, this);
} catch (Exception e) {
OKLog.e(TAG, e);
}
}
}
/**
* 设置轮播左右图片可见,并设置间距
*
* @param margin 左右页面可见宽度
* @param pageMargin page间距
*/
public void setPagerOffset(int margin, int pageMargin) {
if (pager != null) {
pager.setClipToPadding(false);
pager.setPadding(margin, 0, margin, 0);
pager.setPageMargin(pageMargin);
}
}
/**
* 设置对外获取viewPager的方法,便于屏幕切换尺寸时,可以动态修改view高度
*
* @return viewpager
*/
public View getViewPager() {
return pager;
}
/**
* banner图的圆角
*
* @param bannerCornerRadius
*/
public void setBannerCornerRadius(int bannerCornerRadius) {
this.bannerCornerRadius = bannerCornerRadius;
}
public void setViewPagerScroller(Scroller scroller) {
try {
Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
scrollerField.set(getViewPager(), scroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static class CustomDurationScroller extends Scroller {
public int duration = 500;
public CustomDurationScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, this.duration);
}
public void setCustomDuration(int duration) {
this.duration = duration;
}
}
}
我们在使用的过程中,主意 autoChangeViewPagerPosition(VIEW_CHANGE_INTERVAL + this.scrollDuration);
的时间要比 this.scrollDuration 的时间要长,不然实现不了轮播,这个地方是遇到的坑。
我们看到在View 中主要是viewPager 和 开放的游标接口
我们先看下CarouselFigureViewPager,我们看下具体实现
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
public class CarouselFigureViewPager extends ViewPager implements OnTouchListener {
private static final String TAG = "CarouselFigureViewPager";
private ViewGroup parent;
/**
* 页面变化监听
*/
private OnPageChangeListener mOuterPageChangeListener;
private OnTouchListener onTouchListener;
private boolean mFirstLayout = true;
/**
* 是否轮播
*/
protected boolean isCarousel = false;
private boolean mOnTouchFlag = false;
public CarouselFigureViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CarouselFigureViewPager(Context context) {
super(context);
}
public void init(ViewGroup parent, boolean isCarousel) {
this.parent = parent;
this.isCarousel = isCarousel;
super.setOnTouchListener(this);
super.setOnPageChangeListener(onPageChangeListener);
}
public void setOnTouchFlag(boolean flag) {
mOnTouchFlag = flag;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mOnTouchFlag) {
return onTouchEvent(event);
}
if (onTouchListener != null) {
onTouchListener.onTouch(v, event);
}
switch (event.getAction()) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(false);
}
if (onTouchListener != null) {
onTouchListener.onTouch(v, event);
}
break;
default:
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
break;
}
try {
onTouchEvent(event);
} catch (Throwable e) {
if (OKLog.E) {
OKLog.e(TAG, e);
}
}
return true;
}
@Override
public void setAdapter(PagerAdapter adapter) {
super.setAdapter(adapter);
if (adapter != null && isCarousel && adapter.getCount() > 1) {
setCurrentItem(1, false);
}
}
@Override
protected void onAttachedToWindow() {
if (mFirstLayout) {
super.onAttachedToWindow();
}
mFirstLayout = false;
}
@Override
public void setOnPageChangeListener(OnPageChangeListener listener) {
mOuterPageChangeListener = listener;
}
@Override
public void setOnTouchListener(OnTouchListener l) {
this.onTouchListener = l;
}
private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
private float mPreviousOffset = -1;
private float mPreviousPosition = -1;
@Override
public void onPageSelected(int position) {
int realPosition = toRealPosition(position);
if (mPreviousPosition != realPosition) {
mPreviousPosition = realPosition;
if (mOuterPageChangeListener != null) {
mOuterPageChangeListener.onPageSelected(realPosition);
}
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (isCarousel && null != getAdapter() && getAdapter().getCount() > 3) {
final int nextPosition = getEdgeNextPosition(position);
if (positionOffset == 0 && mPreviousOffset == 0
&& (position == 0 || position == getAdapter().getCount() - 1)) {
post(new Runnable() {
@Override
public void run() {
setCurrentItem(nextPosition, false);
}
});
}
}
mPreviousOffset = positionOffset;
int realPosition = toRealPosition(position);
if (mOuterPageChangeListener != null) {
if (null != getAdapter() && (position != 0 || position != getAdapter().getCount() - 1)) {
mOuterPageChangeListener.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
} else {
if (positionOffset > .5) {
mOuterPageChangeListener.onPageScrolled(0, 0, 0);
} else {
mOuterPageChangeListener.onPageScrolled(realPosition, 0, 0);
}
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (null != getAdapter() && isCarousel && getAdapter().getCount() > 3) {
int position = getCurrentItem();
if (state == ViewPager.SCROLL_STATE_IDLE && (position == 0 || position == getAdapter().getCount() - 1)) {
int nextPosition = getEdgeNextPosition(position);
setCurrentItem(nextPosition, false);
}
}
if (mOuterPageChangeListener != null) {
mOuterPageChangeListener.onPageScrollStateChanged(state);
}
}
};
/**
* 获取实际位置,即圆点位置
*
* @param position 当前位置
*/
public int toRealPosition(int position) {
if (null == getAdapter()) {
return 0;
}
if (!isCarousel) {
return position;
}
int realCount = getRealCount();
if (realCount == 0)
return 0;
int realPosition = (position - 1) % realCount;
if (realPosition < 0)
realPosition += realCount;
return realPosition;
}
/**
* @return 真实个数
*/
public int getRealCount() {
if (null == getAdapter()) {
return 0;
}
if (isCarousel && getAdapter().getCount() > 3) {
return getAdapter().getCount() - 2;
}
return getAdapter().getCount();
}
/**
* 边缘位置获取下一个位置
*
* @param position 当前位置
* @return
*/
private int getEdgeNextPosition(int position) {
int nextPosition = position;
if (isCarousel && getRealCount() > 1) {
if (position == 0) {
nextPosition = getRealCount();
} else if (position == getRealCount() + 1) {
nextPosition = 1;
}
}
return nextPosition;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (onTouchListener != null) {
onTouchListener.onTouch(null, ev);
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
我们一般会自定义游标,这里给个实现游标的例子
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.facebook.drawee.view.SimpleDraweeView;
/**
* @author hubenkui
* @date: 2019-08-07 11:49
*/
public class HomeBannerCursorImpl implements ICursorCtrl {
/**
* 游标容器
*/
private LinearLayout cursorContent;
/**
* 上一次的游标地址
*/
private int oldCursorPosition = 0;
private int curPosition = 0;
private int cursorWidth = 4, cursorHeight = 4;
private int cursorSpace = 2;
int cursorMarginBottom = 0;
int highLightId;
int normalId;
@Override
public void initCursorContentView(Context c, int viewId) {
if (cursorContent == null) {
cursorContent = new LinearLayout(c);
FrameLayout.LayoutParams cursorParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
//cursorParams.setMargins(0, 0, 0, cursorMarginBottom > 0 ? cursorMarginBottom : 6);
cursorParams.setMargins(0, 0, 0, cursorMarginBottom);
cursorParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
cursorContent.setPadding(0, 0, 0, 0);
cursorContent.setOrientation(LinearLayout.HORIZONTAL);
cursorContent.setLayoutParams(cursorParams);
}
}
@Override
public void createCursor(int size, ViewGroup vp, int currentItemPosition) {
if (size < 1) { // 如果没有数据,就不要显示轮播图了
vp.setVisibility(View.GONE);
return;
}
if (cursorContent == null) return;
if (vp.getVisibility() == View.GONE) {
vp.setVisibility(View.VISIBLE);
}
if (size < 2) {
cursorContent.setVisibility(View.GONE);
return;
}
if (cursorContent.getVisibility() == View.GONE) {
cursorContent.setVisibility(View.VISIBLE);
}
cursorContent.removeAllViews();
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
cursorWidth, cursorHeight);
params.gravity = Gravity.CENTER;
// params.setMargins(0, 0, cursorSpace, 0);
for (int i = 0; i < size; i++) {
SimpleDraweeView cursorView = new SimpleDraweeView(cursorContent.getContext());
cursorView.setLayoutParams(params);
cursorView.setScaleType(ImageView.ScaleType.FIT_CENTER);
cursorView.setImageResource(normalId);
cursorContent.addView(cursorView);
}
openLight(currentItemPosition);
if (cursorContent.getParent() == null) {
vp.addView(cursorContent);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
closeLight(oldCursorPosition);
openLight(position);
}
/**
* 将一个游标的颜色设置为高亮颜色
*
* @param index
*/
private void openLight(int index) {
if ((cursorContent != null) && (index >= 0)) {
final ImageView v = (ImageView) cursorContent.getChildAt(index);
if (v != null) {
v.setImageResource(highLightId);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
if (params != null){
params.height = cursorWidth;
params.width = DPIUtil.dip2px(8);
v.setLayoutParams(params);
}
}
curPosition = index;
}
}
/**
* 将一个游标的颜色设置为普通颜色
*
* @param index
*/
private void closeLight(int index) {
if ((cursorContent != null) && (index >= 0)) {
final ImageView v = (ImageView) cursorContent.getChildAt(index);
if (v != null) {
v.setImageResource(normalId);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
if (params != null){
params.height = cursorWidth;
params.width = cursorWidth
;
v.setLayoutParams(params);
}
}
}
}
@Override
public void setCurrentCursorPosition(int position) {
oldCursorPosition = position;
}
@Override
public boolean equalsOldCursorPosition(int position) {
return oldCursorPosition == position;
}
@Override
public int getCurPosition() {
return curPosition;
}
@Override
public void updateCursorBottomMargin(int cursorMarginBottom) {
if (cursorContent != null) {
ViewGroup.LayoutParams vplp = cursorContent.getLayoutParams();
if ((vplp != null) && (vplp instanceof RelativeLayout.LayoutParams)) {
RelativeLayout.LayoutParams rllp = (RelativeLayout.LayoutParams) vplp;
rllp.setMargins(0, 0, 0, cursorMarginBottom);
cursorContent.setLayoutParams(rllp);
}
}
}
@Override
public void showCursorContent() {
if (cursorContent != null) {
cursorContent.setVisibility(View.VISIBLE);
}
}
@Override
public void hideCursorContent() {
if (cursorContent != null) {
cursorContent.setVisibility(View.GONE);
}
}
@Override
public void removeCursor() {
if (null == cursorContent) {
return;
}
cursorContent.removeAllViews();
ViewParent parent = cursorContent.getParent();
if (null != parent) {
((ViewGroup) parent).removeView(cursorContent);
}
}
@Override
public View getCursorView() {
return null;
}
@Override
public void setCursorStyle(int bottomMargin, int hId, int nId) {
cursorMarginBottom = bottomMargin;
highLightId = hId;
normalId = nId;
}
}
我们看下在代码中是如何使用
ICursorCtrl cursorCtrl = new HomeBannerCursorImpl();
cursorCtrl.setCursorStyle(DPIUtil.dip2px(5), R.drawable.banner_light_icon, R.drawable.banner_normal_icon);
mLoopViewPager.setCursorCtrl(cursorCtrl);
mLoopViewPager.setBannerCornerRadius(DPIUtil.dip2px(5));
mLoopViewPager.init(mContext, mViewPageRootView, DPIUtil.dip2px(100), true, entity.content.size() > 1, DPIUtil.dip2px(1), entity.cfg != null ? entity.cfg.slip_time : 4000);
mLoopViewPager.setCarouseFigureImageAdapterListener(new CarouseFigureImagePagerAdapter.CarouseFigureImageAdapterListener() {
@Override
public int getCount() {
}
@Override
public String getImageUrl(int position) {
}
@Override
public void onClick(int position) {
@Override
public JDDisplayImageOptions getJDDisplayImageOptions() {
return null;
}
});
我们看到这个地方是和imageView 强绑定的,我们看下
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.facebook.drawee.view.SimpleDraweeView;
public class CarouseFigureImagePagerAdapter extends PagerAdapter {
protected final static int LAST_URL = R.id.image_last_url;
private Context context;
private int cornerRadius;
/**
* 是否轮播
*/
private boolean isCarousel;
private CarouseFigureImageAdapterListener imageAdapterListener;
private boolean isAllChange;
/**
* 焦点图缓存
*/
private ImageView first;
private ImageView last;
protected DisplayImageOptions displayOptions;
public CarouseFigureImagePagerAdapter(Context c, boolean isCarousel, CarouseFigureImageAdapterListener listener) {
this(c, isCarousel, 0, listener);
}
public CarouseFigureImagePagerAdapter(Context c, boolean isCarousel, int cornerRadius, CarouseFigureImageAdapterListener listener) {
context = c;
this.isCarousel = isCarousel;
imageAdapterListener = listener;
this.cornerRadius = cornerRadius;
initImage();
}
@Override
public void notifyDataSetChanged() {
initImage();
super.notifyDataSetChanged();
}
/**
* 所有数据发生变化
*
* @param isAllChange
*/
public void setAllChanged(boolean isAllChange) {
this.isAllChange = isAllChange;
}
@Override
public int getItemPosition(Object object) {
if (isAllChange) {
return POSITION_NONE;
} else {
return POSITION_UNCHANGED;
}
}
@Override
public int getCount() {
if (imageAdapterListener != null) {
return imageAdapterListener.getCount() + (isTrueCarousel() ? 2 : 0);
}
return 0;
}
private boolean isTrueCarousel() {
if (imageAdapterListener != null && isCarousel) {
return imageAdapterListener.getCount() >= 2;
}
return false;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
private void initImage() {
if (!isTrueCarousel()) {
return;
}
if (first == null) {
first = getImageView();
}
if (last == null) {
last = getImageView();
}
//初始化最后一张,防止第一次手动向左滑的闪屏
displayImage(last, imageAdapterListener.getImageUrl(imageAdapterListener.getCount() - 1), imageAdapterListener.getDisplayImageOptions());
}
protected int getRealIndex(int position) {
int index = position;
if (isCarousel && imageAdapterListener.getCount() > 1) {
index = (position - 1) % imageAdapterListener.getCount();
if (index < 0)
index += imageAdapterListener.getCount();
}
return index;
}
private ImageView getImageView() {
ImageView imageView = new SimpleDraweeView(context);
imageView.setPadding(0, 0, 0, 0);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!NetUtils.isNetworkAvailable()) {
return;
}
int position = getRealIndex(v.getId());
imageAdapterListener.onClick(position);
}
});
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView;
try {
if (isCarousel && first != null && position == 1) {
imageView = first;
} else if (isCarousel && last != null && position == getCount() - 2) {
imageView = last;
} else {
imageView = getImageView();
}
imageView.setId(position);
container.addView(imageView);
displayImage(imageView, imageAdapterListener.getImageUrl(getRealIndex(position)), imageAdapterListener.getDisplayImageOptions());
} catch (Exception e) {
imageView = new SimpleDraweeView(context);
}
if (isAllChange) {
isAllChange = false;
}
return imageView;
}
public interface CarouseFigureImageAdapterListener {
int getCount();
String getImageUrl(int position);
void onClick(int position);
DisplayImageOptions getDisplayImageOptions();
}
}