public class SlideShowViewSulz extends FrameLayout {
private Context context;
private ImageLoader imageLoader = ImageLoader.getInstance();
private boolean isPlay = true;
private List imageUrls;
private List dotViewsList;
private LinearLayout dotLayout;
private ViewPager viewPager;
private int prePosition = 0;
private int timeSpan;
private static int defaultTimeSpan=5;
private OnItemClickListener onItemClickListener;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
if (!isPlay || viewPager == null || viewPager.getChildCount() < 2)
return;
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
break;
default:
break;
}
}
};
private Thread mAutoPlayThread = new Thread() {
@Override
public void run() {
while (true) {
SystemClock.sleep(timeSpan * 1000);
mHandler.sendEmptyMessage(1);
}
}
};
public SlideShowViewSulz(Context context) {
this(context, defaultTimeSpan);
}
public SlideShowViewSulz(Context context, int timeSpan) {
this(context, null, timeSpan);
}
public SlideShowViewSulz(Context context, AttributeSet attrs, int timeSpan) {
this(context, attrs, 0, timeSpan);
}
public SlideShowViewSulz(Context context, AttributeSet attrs, int defStyle, int timeSpan) {
super(context, attrs, defStyle);
this.context = context;
initImageLoader(context);
mAutoPlayThread.start();
this.timeSpan = timeSpan;
initView();
}
private void initView() {
LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true);
viewPager = (ViewPager) findViewById(R.id.viewPager);
ViewGroup.LayoutParams vParams = viewPager.getLayoutParams();
vParams.height = (int) (DeviceHelper.getMobileWidth(context) * 0.52);
viewPager.setLayoutParams(vParams);
viewPager.setOnTouchListener(mOnTouchListener);
ImageView ivSearch = (ImageView) findViewById(R.id.iv_search);
ivSearch.setOnClickListener(v -> {
Intent intent = new Intent();
intent.setClass(context, SearchActivity.class);
context.startActivity(intent);
});
}
public void setContent(List imgDatalist) {
if (imgDatalist == null || imgDatalist.size() == 0) {
return;
}
imageUrls = imgDatalist;
initUI();
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public void setTimeSpan(int timeSpan) {
this.timeSpan = timeSpan;
}
private void initUI() {
initDotView();
viewPager.setAdapter(new MyPagerAdapter());
viewPager.setOnPageChangeListener(new MyPageChangeListener());
viewPager.setCurrentItem(imageUrls.size() * 60);
}
private void initDotView() {
if (dotLayout == null) {
dotLayout = (LinearLayout) findViewById(R.id.dotLayout);
} else {
dotLayout.removeAllViews();
}
dotViewsList = new ArrayList<>();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.leftMargin = 4;
params.rightMargin = 4;
for (int i = 0; i < imageUrls.size(); i++) {
ImageView dotView = new ImageView(context);
dotView.setBackgroundResource(R.mipmap.h2);
dotLayout.addView(dotView, params);
dotViewsList.add(dotView);
}
dotLayout.getChildAt(0).setBackgroundResource(R.mipmap.h1);
dotViewsList.get(0).setBackgroundResource(R.mipmap.h1);
}
private class MyPageChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int pos) {
dotViewsList.get(prePosition).setBackgroundResource(R.mipmap.h2);
for (View v : dotViewsList) {
v.setBackgroundResource(R.mipmap.h2);
}
dotViewsList.get(pos % dotViewsList.size()).setBackgroundResource(R.mipmap.h1);
prePosition = pos % dotViewsList.size();
}
}
OnTouchListener mOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isPlay = false;
break;
case MotionEvent.ACTION_MOVE:
isPlay = false;
break;
case MotionEvent.ACTION_UP:
isPlay = true;
break;
default:
break;
}
return false;
}
};
private class MyPagerAdapter extends PagerAdapter {
//為了複用
private List imgCache = new ArrayList();
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public void destroyItem(View container, int position, Object object) {
if (object != null && object instanceof ImageView) {
ImageView iv = (ImageView) object;
((ViewPager) container).removeView(iv);
imgCache.add(iv);
}
}
@Override
public Object instantiateItem(View container, final int position) {
ImageView iv;
//擷取ImageView對象
if (imgCache.size() > 0) {
iv = imgCache.remove(0);
} else {
iv = new ImageView(context);
}
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setImageResource(R.mipmap.banner_null);
imageLoader.displayImage(imageUrls.get(position % imageUrls.size()) + "", iv, new SimpleImageLoadingListener());
iv.setOnClickListener(v -> onItemClickListener.onItemClick(iv, position % imageUrls.size()));
((ViewPager) container).addView(iv);
return iv;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
private void initImageLoader(Context context) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO)// Remove
.build();
ImageLoader.getInstance().init(config);
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
}
先上代碼,但是請想要copy就用的各位同志注意一下,代碼中用到了第三方庫ImageLoader。無限輪播的實作其實就是講adapter的count設定了一個int類型的最大值,然後起始位置設為輪播圖檔數量的60倍,這樣,就實作了一開始就可以左右滑動;當然,如果有人拼命讓圖檔一直往左,終能滑到第一張繼而出現劃不動的情況。是以這個數值可以設大一點,但是不能設太大,因為筆者就因為設了int最大值的1/2而出現了程式ANR的情況。請各位盡量看懂代碼後操作,此篇為思路文。如有問題歡迎留言一起讨論。