Banner 无限轮播
public class BannerViewPager extends FrameLayout implements View.OnClickListener {
private ItemClickListener itemClickListener;
/**
* 图片内容
*/
private List<HomeData.BannerData> mList;
/**
* View
*/
private List<View> mViews;
/**
* 下标
*/
private List<ImageView> mImgs;
/**
* 延迟时间
*/
private long delaytime;
/**
* 是否自动滚动
*/
private boolean isAuto;
private Handler mHandle;
private int currentItem;
private LazyViewPager vp;
private Context mContext;
public BannerViewPager(Context context) {
this(context, null);
}
public BannerViewPager(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BannerViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initViews();
}
private void initViews() {
mViews = new ArrayList<>();
mImgs = new ArrayList<>();
mHandle = new Handler(mContext.getMainLooper());
delaytime = 3000;
}
public void setData(List<HomeData.BannerData> lists) {
this.mList = lists;
mImgs.clear();
mViews.clear();
initDatas();
}
public List<HomeData.BannerData> getData(){
return mList;
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
switch (visibility) {
case View.VISIBLE:
Log.d("yu", "vis");
isAuto = true;
break;
default:
Log.d("yu", "default : " + visibility);
isAuto = false;
break;
}
}
private void initDatas() {
int length = mList.size();
View view = LayoutInflater.from(mContext).inflate(R.layout.banner_view, this, true);
LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_points);
vp = (LazyViewPager) view.findViewById(R.id.vp);
ll.removeAllViews();
LinearLayout.LayoutParams ll_parmas = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
ll_parmas.leftMargin = 5;
ll_parmas.rightMargin = 5;
for (int i = 0; i < length; i++) {
ImageView img = new ImageView(mContext);
img.setLayoutParams(ll_parmas);
if (i == 0) {
img.setImageResource(R.mipmap.page_indicator_focused);
} else {
img.setImageResource(R.mipmap.page_indicator_unfocused);
}
ll.addView(img);
mImgs.add(img);
final ImageView imgforview = new ImageView(mContext);
imgforview.setOnClickListener(this);
imgforview.setScaleType(ImageView.ScaleType.FIT_XY);
LogUtil.e("首页banner:",HttpURL.ISGO_HTTP_BITMAP_BASE + mList.get(i).imgUrlApp);
Glide.with(mContext).load(HttpURL.ISGO_HTTP_BITMAP_BASE + mList.get(i).imgUrlApp).placeholder(R.mipmap.example).into(imgforview);
mViews.add(imgforview);
}
vp.setAdapter(new MyAdapter());
if(mViews.size() <= 1){
isAuto = false;
}else{
vp.setOnPageChangeListener(onPageChange);
isAuto = true;
mHandle.postDelayed(task, delaytime);
}
}
private Runnable task = new Runnable() {
@Override
public void run() {
if (isAuto) {
if (currentItem == 0) {
vp.setCurrentItem(currentItem, false);
} else {
vp.setCurrentItem(currentItem);
}
currentItem++;
mHandle.postDelayed(task, delaytime);
} else {
mHandle.postDelayed(task, delaytime);
}
}
};
private int preposition;
private LazyViewPager.OnPageChangeListener onPageChange = new LazyViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentItem = vp.getCurrentItem();
position = position % mViews.size();
if (position == preposition) {
mImgs.get(position).setImageResource(R.mipmap.page_indicator_focused);
} else {
mImgs.get(position).setImageResource(R.mipmap.page_indicator_focused);
mImgs.get(preposition).setImageResource(R.mipmap.page_indicator_unfocused);
}
preposition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case LazyViewPager.SCROLL_STATE_IDLE://用户什么都没有操作
// isAuto=true;
break;
case LazyViewPager.SCROLL_STATE_DRAGGING://正在滑动
isAuto = false;
break;
case LazyViewPager.SCROLL_STATE_SETTLING://滑动结束
isAuto = true;
break;
}
}
};
public void setItemClickListener(ItemClickListener listener) {
this.itemClickListener = listener;
}
public interface ItemClickListener {
void click(View view, HomeData.BannerData bean, int position);
}
@Override
public void onClick(View v) {
if (itemClickListener != null) {
int currentItem = vp.getCurrentItem() % mViews.size();
itemClickListener.click(v, mList.get(currentItem), currentItem);
}
}
private class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position = position % mViews.size();
if (mViews.get(position).getParent() != null) {
((LazyViewPager) mViews.get(position).getParent()).removeView(mViews.get(position));
}
((LazyViewPager) container).addView(mViews.get(position), 0);
return mViews.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
isAuto = false;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
isAuto = true;
break;
}
return super.dispatchTouchEvent(ev);
}
}
banner_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background">
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:padding="8dip">
</LinearLayout>
</merge>
调用: mViewPager.setData(datas);即可