Carousel of home page pictures
/** * Automatic rotation control for advertising images</br> * */public class ImageCycleView extends LinearLayout { /** * Context*/ private Context mContext; /** * Image rotation view*/ private ViewPager mAdvPager = null; /** * Scroll image view adaptation*/ private ImageCycleAdapter mAdvAdapter; /** * Image rotation indicator control*/ private ViewGroup mGroup; /** * Picture carousel indicates each picture */ private ImageView mImageView = null; /** * Scroll picture instruction view list */ private ImageView[] mImageViews = null; /** * Picture scrolling current picture subscript */ private boolean isStop; / ** * Whether the cursor is circular or long. If it is set to 0, it will be long. If it is set to 1, it will be circular. The default is circular */ public int stype=1; /** * @param context */ public ImageCycleView(Context context) { super(context); } /** * @param context * @param attrs */ @SuppressLint("Recycle") public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this); mAdvPager = (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); // Scroll the lower right indicator of the picture mGroup = (ViewGroup) findViewById(R.id.viewGroup); } /** * Touch stops the timer, lift starts the timer*/ @Override public boolean dispatchTouchEvent(MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP){ // Start image scrolling startImageTimerTask(); }else{ // Stop image scrolling stopImageTimerTask(); } return super.dispatchTouchEvent(event); } /** * Load image data * * @param imageUrlList * @param imageCycleViewListener */ public void setImageResources(ArrayList<Integer> imageUrlList,ImageCycleViewListener imageCycleViewListener,int stype){ this.stype=stype; // Clear mGroup.removeAllViews(); // Number of image ads final int imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin=30; mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i] = mImageView; if (i == 0) { if(this.stype==1)// mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus); mImageViews[i].setBackgroundResource(R.drawable .cicle_banner_dian_focus);//Change to else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); } else { if(this.stype==1) // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); mImageViews[i].setBackgroundResource(R .drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]); } mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList,imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } public void setImageResources2(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ this.stype=stype; // Clear mGroup.removeAllViews(); // Number of image ads final int imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams. WRAP_CONTENT); params.leftMargin=30; mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i] = mImageView; if (i == 0) { if (this.stype==1)// mImageViews[i].setBackgroundResource(R .drawable.banner_dian_focus); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//Change else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); } else { if(this.stype==1) // mImageViews[i ].setBackgroundResource(R.drawable.banner_dian_blur); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]); } mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList ,imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } /** * Image carousel (manual control of automatic carousel or not, convenient for resource control) */ public void startImageCycle() { startImageTimerTask(); } /** * Pause carousel - used to save resources*/ public void pushImageCycle() { stopImageTimerTask(); } /** * Image scrolling task*/ private void startImageTimerTask() { stopImageTimerTask(); // Image scrolling mHandler.postDelayed(mImageTimerTask, 5000); } /** * Stop the image scrolling task*/ private void stopImageTimerTask() { isStop=true; mHandler.removeCallbacks(mImageTimerTask); } private Handler mHandler = new Handler(); /** * Automatic image rotation Task */ private Runnable mImageTimerTask = new Runnable() { @Override public void run () { if (mImageViews != null) { mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); if(!isStop){ //if isStop=true //When you exit, you need to stop this, otherwise it will continue to exist and loop in the background mHandler.postDelayed( mImageTimerTask, 5000); } } } }; /** * Carousel image monitoring* * @author minking */ private final class GuidePageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) startImageTimerTask(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int index) { index=index%mImageViews.length; // Set the currently displayed image // Set the image scroll indicator back if(stype!=1) mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); else mImageViews[index] .setBackgroundResource(R.drawable.cicle_banner_dian_focus); for (int i = 0; i < mImageViews.length; i++) { if (index != i) { if(stype!=1) mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur) ; } } } } private class ImageCycleAdapter extends PagerAdapter { /** * Picture view cache list*/ private ArrayList<SmartImageView> mImageViewCacheList; /** * Picture resource list*/ //private ArrayList<String> mAdList = new ArrayList<String>(); private ArrayList<Integer> mAdList = new ArrayList<Integer>(); /** * Ad image click monitoring*/ private ImageCycleViewListener mImageCycleViewListener; private Context mContext;// public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener imageCycleViewListener) {// this.mContext = context; // this.mAdList = adList; // mImageCycleViewListener = imageCycleViewListener; // mImageViewCacheList = new ArrayList<SmartImageView>();// } public ImageCycleAdapter(Context context, ArrayList<Integer> adList , ImageCycleViewListener imageCycleViewListener) { this.mContext = context; this.mAdList = adList; mImageCycleViewListener = imageCycleViewListener; mImageViewCacheList = new ArrayList<SmartImageView>( ); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object obj) { return view == obj; } @Override public Object instantiateItem(ViewGroup container, final int position) { int imageUrl = mAdList .get(position%mAdList.size()); Log.e("imageUrl:",position%mAdList.size()+"--"+imageUrl+""); SmartImageView imageView = null; if (mImageViewCacheList.isEmpty()) { imageView = new SmartImageView(mContext); imageView .setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //test imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); } else { imageView = mImageViewCacheList.remove(0); } imageView.setTag(imageUrl); container.addView(imageView); //imageView .setImageUrl(imageUrl); imageView.setBackgroundResource(imageUrl); //Set image click listener imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mImageCycleViewListener.onImageClick(position%mAdList.size(), v); } }); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { SmartImageView view = (SmartImageView) object; mAdvPager.removeView(view); mImageViewCacheList.add(view); } } /** * Listening events for the carousel control* * @author minking */ public static interface ImageCycleViewListener { /** * Click the picture Event * * @param position * @param imageView */ public void onImageClick(int position, View imageView); } }
Let’s take a look at a picture carousel control based on Android ViewPager
package me.lanfog.myandroid.widget; import java.util.ArrayList;import java.util.List; import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4 .view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView; public class PageFlipper extends ViewPager { private String TAG = PageFlipper.class.getSimpleName(); private List<View> views; private PagerAdapter adapter = new PagerAdapter() { @Override public Object instantiateItem(ViewGroup container, int position) { View v = views.get(position); container.addView(v); return v; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getItemPosition(Object object) { return views.indexOf(object); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } @Override public int getCount() { return views == null ? 0 : views.size(); } }; private OnPageChangeListener listener = new OnPageChangeListener() { /** * Will Convert the control position to the position in the data set*/ public int convert(int position){ return position == 0 ? views.size()-1 : ( position > views.size() ? 0 : position-1 ); } @Override public void onPageSelected(int position) { if(listener2 != null){ listener2.onPageSelected(convert(position)); } } @Override public void onPageScrolled(int position, float percent, int offset) { if(listener2 != null){ listener2.onPageScrolled(convert(position), percent, offset); } if(percent == 0){ if(position == 0) // Switch to the penultimate page setCurrentItem(( views.size() - 2 ) % views.size(), false); else if(position == views.size() - 1) // Switch to the second positive page setCurrentItem(1, false); } } @Override public void onPageScrollStateChanged(int state) { if(listener2 != null){ listener2.onPageScrollStateChanged(state); } switch (state) { case SCROLL_STATE_IDLE: // Idle if(!handler.hasMessages(START_FLIPPING)) handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // Delay scroll break; case SCROLL_STATE_DRAGGING: // handler.sendEmptyMessage(STOP_FLIPPING); // Cancel scrolling break; case SCROLL_STATE_SETTLING: // Dragging ends break; } } }, listener2; private final int START_FLIPPING = 0; private final int STOP_FLIPPING = 1; private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case START_FLIPPING: if(views.size() > 3) // Because the front and back pages are auxiliary pages, 3 here means only 1 page setCurrentItem((getCurrentItem() + 1) % views.size ()); handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // Delayed scrolling break; case STOP_FLIPPING: handler.removeMessages(START_FLIPPING); break; } } }; public PageFlipper(Context context, AttributeSet attrs) { super(context, attrs); init(); } public PageFlipper(Context context) { super(context); init() ; } private void init(){ setOffscreenPageLimit(1); // Maximum page cache number setAdapter(adapter); // Adapter super.setOnPageChangeListener(listener); // Listener handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // Delayed scrolling} public void setViews(int[] ids){ this. views = new ArrayList<View>(); for(int i=0;i<ids.length+2;i++){ // Add a last page at the head and a home page at the end. ImageView iv = new ImageView(getContext()); iv.setImageResource(ids[i == 0 ? ids.length-1 : ( i > ids.length ? 0 : i-1 )]); iv.setScaleType(ImageView.ScaleType.FIT_XY); this.views.add(iv); } setCurrentItem(1); // Home page this.adapter.notifyDataSetChanged(); } @Override public void setOnPageChangeListener(OnPageChangeListener listener) { this.listener2 = listener; } }