Карусель фотографий главной страницы
/** * Управление автоматическим поворотом рекламного изображения</br> * */public class ImageCycleView Extends LinearLayout { /** * Context*/ Private Context mContext; /** * Представление вращения изображения*/ Private ViewPager mAdvPager = null; * * Адаптация просмотра изображения при прокрутке*/ Private ImageCycleAdapter mAdvAdapter /** * Управление индикатором поворота изображения*/ Private ViewGroup mGroup; Карусель изображений указывает каждое изображение */ Private ImageView mImageView = null; /** * Список просмотра инструкций для прокрутки изображения */ Private ImageView[] mImageViews = null; /** * Индекс прокрутки текущего изображения */ Private boolean isStop / **; * Независимо от того, круглый или длинный курсор. Если установлено значение 0, он будет длинным. Если установлено значение 1, он будет круглым. По умолчанию используется значение круглое. */ public int stype=1; контекст параметра */ public ImageCycleView(Контекст контекста) { super(context); /** * @param context * @param attrs */ @SuppressLint("Recycle") public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); = контекст; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, mAdvPager = (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); // Прокрутка нижнего правого индикатора изображения mGroup = (ViewGroup) findViewById(R.id.viewGroup); * Прикосновение останавливает таймер, лифт запускает таймер*/ @Override public boolean sendTouchEvent(MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP){ // Начать прокрутку изображения startImageTimerTask(); }else{ // Остановить прокрутку изображения stopImageTimerTask(); } return super.dispatchTouchEvent(event); } /** * Загрузка данных изображения * * @param imageUrlList * @param imageCycleViewListener */ public void setImageResources(ArrayList<Integer> imageUrlList,ImageCycleViewListener imageCycleViewListener,int stype){ this.stype=stype; // Очистить mGroup.removeAllViews(); // Количество графических объявлений Final imageCount = imageUrlList.size(); mImageViews = новый ImageView [imageCount] для (int я = 0; я < imageCount; я ++) { mImageView = новый ImageView (mContext); LayoutParams = новый LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin = 30; mImageView.setScaleType (ScaleType.CENTER_CROP); 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);//Изменить на другое 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 еще); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]); } mAdvAdapter = новый ImageCycleAdapter(mContext, imageUrlList, imageCycleViewListener); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } public void setImageResources2(ArrayList<Integer> imageUrlList, ImageCycleViewListener imageCycleViewListener,int stype) { this.stype=stype; // Очистить mGroup.removeAllViews(); Количество графических объявлений Final int imageCount = imageUrlList.size (); mImageViews = новый 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);//Изменить 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 startImageCycle() { startImageTimerTask() } /** *; Карусель паузы — используется для сохранения ресурсов*/ public void pushImageCycle() { stopImageTimerTask(); } /** * Задача прокрутки изображения*/ Private void startImageTimerTask() { stopImageTimerTask(); // Прокрутка изображения mHandler.postDelayed(mImageTimerTask, 5000) } /** * Остановить задачу прокрутки изображения*/ Private void stopImageTimerTask() { isStop=true; mHandler.removeCallbacks(mImageTimerTask } Private Handler mHandler = new Handler(); /** * Задача автоматического поворота изображения */ Private Runnable mImageTimerTask = new Runnable() { @Override public void run ( ) { if (mImageViews != null) { mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); if(!isStop){ //if isStop=true //При выходе необходимо остановить это, иначе оно продолжит существовать и зациклится в фоновом режиме mHandler. postDelayed( mImageTimerTask, 5000 } } } }; /** * Мониторинг изображений карусели* * @author minking */ Private конечный класс GuidePageChangeListener реализует 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%mImageViews.length; // Устанавливаем отображаемое в данный момент изображение // Возвращаем индикатор прокрутки изображения 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); } } } } частный класс ImageCycleAdapter расширяется PagerAdapter { /** * Список кэша изображений*/ Private ArrayList<SmartImageView> mImageViewCacheList /** * Список ресурсов изображений*/ //private ArrayList<String> mAdList = new ArrayList<String>(); mAdList = new ArrayList<Integer>(); /** * Мониторинг кликов по изображениям*/ Private ImageCycleViewListener; mImageCycleViewListener; частный контекст mContext;// public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener imageCycleViewListener) {// this.mContext = context; // this.mAdList = adList; // mImageCycleViewListener = imageCycleViewListener; новый Arraylist <martimageview> (); //} publicecycycleadapter (контекст, Arraylist <Integer> Adlist, ImageCycleviewlistener ImageCycleviewListener) {this.mcontext = context; ); } @Переопределить public int getCount() { return Integer.MAX_VALUE } @Override public boolean isViewFromObject (View view, Object obj) { return view == obj } @Override public Object InstantiateItem (контейнер ViewGroup, конечная позиция int) { int imageUrl = mAdList .get(position%mAdList.size()); Log.e("imageUrl:",position%mAdList.size()+"--"+imageUrl+""); .setLayoutParams(новый LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); // тест imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); else { imageView = mImageViewCacheList.remove(0); } imageView.setTag(imageUrl); //imageView; .setImageUrl(imageUrl); imageView.setBackgroundResource(imageUrl); //Устанавливаем прослушиватель кликов по изображению imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mImageCycleViewListener.onImageClick(position%mAdList.size(), v); } }); return imageView; public void уничтожитьItem (контейнер ViewGroup, позиция int, объект Object) { SmartImageView view = (SmartImageView) object; mAdvPager.removeView(view); mImageViewCacheList.add(view); /** * Прослушивание событий для элемента управления каруселью* * @author minking */ public staticinterface ImageCycleViewListener { /** * Щелкните изображение Событие * * @paramposition * @param imageView */ public void onImageClick(intposition, View imageView);
Давайте посмотрим на элемент управления каруселью изображений на базе Android ViewPager.
пакет me.lanfog.myandroid.widget; импорт java.util.ArrayList; импорт java.util.List; импорт android.content.Context; импорт android.os.Handler; импорт android.os.Message; импорт android.support.v4 .view.PagerAdapter;импорт android.support.v4.view.ViewPager;импорт android.util.AttributeSet;импорт android.util.Log; импорт android.view.View; импорт android.view.ViewGroup; импорт android.widget.ImageView; открытый класс PageFlipper расширяет ViewPager {частный String TAG = PageFlipper.class.getSimpleName(); представления частного адаптера PagerAdapter = новый PagerAdapter () { @Override public Object InstantiateItem (контейнер ViewGroup, позиция int) {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(объект); @Override public void уничтожитьItem(контейнер ViewGroup, позиция int, объект Object) { Container.removeView((View)object); } @Override public int getCount() { returnviews == null ? 0 :views.size(); } }; частный прослушиватель OnPageChangeListener = new OnPageChangeListener() { /** * Будет Преобразование контрольной позиции в позицию в наборе данных*/ public int Convert(int Position){ return Position == 0 ?views.size()-1 : (position >views.size() ? 0 : позиция-1); } @Override public void onPageSelected(int Position) { if(listener2 != null) { Listener2.onPageSelected(convert(position) } } @Override public void onPageScrolled(int Position, float процент, int offset) { if(listener2 != null) {listener2.onPageScrolled(convert(position), процент, смещение }); if(percent == 0){ if(position == 0) // Переход на предпоследнюю страницу setCurrentItem((views.size() - 2) %views.size(), false else if(position ==views); .size() - 1) // Переключение на вторую положительную страницу 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); // Задержка прокрутки; SCROLL_STATE_DRAGGING: // Handler.sendEmptyMessage(STOP_FLIPPING); // Отмена прокрутки; case SCROLL_STATE_SETTLING: // Перетаскивание заканчивается Break; } } }, Listener2; Private Final int START_FLIPPING = 0; Private Final Int STOP_FLIPPING = 1; Private Handler(); { public void handleMessage(Message msg) {переключатель (msg.what) { case START_FLIPPING: if(views.size() > 3) // Поскольку передняя и задняя страницы являются вспомогательными, 3 здесь означает только 1 страницу setCurrentItem((getCurrentItem() + 1) %views.size ()); handler.sendEmptyMessageDelayed(START_FLIPPING, 3000 // Отложенный перерыв прокрутки; случай STOP_FLIPPING: handler.removeMessages(START_FLIPPING); public PageFlipper(Context context, AttributeSet attrs) { super(context, attrs); } public PageFlipper(Context context) { super(context()); ; } Private void init() { setOffscreenPageLimit(1); Максимальный номер кэша страницы setAdapter(adapter); // Адаптер super.setOnPageChangeListener(listener); // Обработчик прослушивателя.sendEmptyMessageDelayed(START_FLIPPING, 3000); // Отложенная прокрутка} public void setViews(int[] ids){ this. новый ArrayList<View>(); for(int i=0;i<ids.length+2;i++){ // Добавляем последнюю страницу в начало и домашнюю страницу в конец. ImageView iv = new ImageView(getContext()); iv.setImageResource(ids[i == 0 ? ids.length-1 : (i > ids. длина ? 0: i-1)]); iv.setScaleType(ImageView.ScaleType.FIT_XY); this.views.add(iv); setCurrentItem(1); // Домашняя страница this.adapter.notifyDataSetChanged(); } @Override public void setOnPageChangeListener (прослушиватель OnPageChangeListener) { this.listener2 = прослушиватель;