دائري من صور الصفحة الرئيسية
/** * التحكم التلقائي في التدوير للصور الإعلانية</br> * */public class ImageCycleView Extends LinearLayout { /** * سياق*/ خاص سياق 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(Context context) { super(context); } /** * @param context * @param attrs */ @SuppressLint("Recycle") public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); = context; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this); (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); // قم بالتمرير بالمؤشر الأيمن السفلي للصورة mGroup = (ViewGroup) findViewById(R.id.viewGroup); * اللمس يوقف المؤقت، والرفع يبدأ المؤقت*/ @Override public boolean SubmitTouchEvent(MotionEvent events) { 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 int imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); 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 else)؛ mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i] } mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList,imageCycleViewListener); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } public void setImageResources2(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ // Clear mGroup.removeAllViews(); عدد الإعلانات المصورة النهائية imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); WRAP_CONTENT); mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i] = mImageView; .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); 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(); } /** * مهمة تمرير الصور*/ public void startImageTimerTask() { stopImageTimerTask(); // تمرير الصور mHandler.postDelayed(mImageTimerTask, 5000 } /** * إيقاف مهمة تمرير الصورة*/ public void stopImageTimerTask() { isStop=true; mHandler.removeCallbacks(mImageTimerTask); ) { إذا (mImageViews != null) { mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); if(!isStop){ //if isStop=true // عند الخروج، تحتاج إلى إيقاف هذا، وإلا فسوف يستمر في الوجود ويتكرر في الخلفية mHandler. postDelayed( mImageTimerTask, 5000); الطبقة النهائية GuidePageChangeListener تنفذ OnPageChangeListener { @Override public void onPageScrollStateChanged(intstate) { if (state == ViewPager.SCROLL_STATE_IDLE) startImageTimerTask(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public باطلة onPageSelected (مؤشر كثافة العمليات) { Index=index%mImageViews.length; // تعيين الصورة المعروضة حاليًا // اضبط مؤشر تمرير الصورة مرة أخرى if(stype!=1) mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus آخر 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; Private context mContext;// public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener imageCycleViewListener) {// this.mContext = context; // this.mAdList = adList; // mImageCycleViewListener = imageCycleViewListener; جديد 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+""); .setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //اختبار imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); } else { imageView = mImageViewCacheList(0); .setImageUrl(imageUrl); // ضبط مستمع النقر على الصورة imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mImageCycleViewListener.onImageClick(position%mAdList.size(), v); } }); return imageView; public void DestroyItem(ViewGroup Container, int Position, Object object) { SmartImageView view = (SmartImageView) object; mAdvPager.removeView(view); mImageViewCacheList.add(view); } } /** * أحداث الاستماع للتحكم في الرف الدائري* * @author minking */ public static Interface ImageCycleViewListener { /** * انقر على الصورة الحدث * * @param Position * @param imageView */ public void onImageClick(int location, View imageView);
دعونا نلقي نظرة على عنصر التحكم في مكتبة الصور استنادًا إلى 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(); view; محول PagerAdapter الخاص = new PagerAdapter() { @Override public Object InstantiateItem(ViewGroup Container, int Position) { View v = view.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 view == null ? : views.size() } }; public OnPageChangeListener() { /** * Will تحويل موضع التحكم إلى الموضع في مجموعة البيانات*/ public int converter(int Position){ return location == 0 ? 0 : Position-1 ); } @Override public void onPageSelected(int Position) { if(listener2 != null){listener2.onPageSelected(convert(position) } } @Override public void onPageScrolled(int location, float بالمائة, int offset) { if(listener2 != null){listener2.onPageScrolled(convert(position),percent, offset }); if(percent == 0){ if(position == 0) // التبديل إلى الصفحة قبل الأخيرة setCurrentItem(( views.size() - 2 ) % view.size(), false else if(position == views .size() - 1) // التبديل إلى الصفحة الإيجابية الثانية setCurrentItem(1, false } } @Override public void onPageScrollStateChanged(intstate) { if(listener2); != null){listener2.onPageScrollStateChanged(state); } Switch (state) { case SCROLL_STATE_IDLE: // خامل if(!handler.hasMessages(START_FLIPPING)) Handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); SCROLL_STATE_DRAGGING: // Handler.sendEmptyMessage(STOP_FLIPPING); { public void HandleMessage(Message msg) { Switch (msg.what) { الحالة START_FLIPPING: if(views.size() > 3) // لأن الصفحات الأمامية والخلفية هي صفحات مساعدة، 3 هنا تعني صفحة واحدة فقط setCurrentItem((getCurrentItem() + 1) % view.size ()); Handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); Handler.removeMessages(START_FLIPPING);break; public PageFlipper(Context context, AttributeSet attrs) { super(context, attrs()); } public void init(){ setOffscreenPageLimit(1); الحد الأقصى لرقم ذاكرة التخزين المؤقت للصفحة setAdapter(adapter); // محول super.setOnPageChangeListener(listener); // المستمع Handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // التمرير المؤجل} public void setViews(int[] ids){ this new ArrayList<View>(); for(int i=0;i<ids.length+2;i++){ // أضف صفحة أخيرة في الرأس وصفحة رئيسية في النهاية ImageView iv = new ImageView(getContext()); length 0 : i-1 )]); iv.setScaleType(ImageView.ScaleType.FIT_XY); // الصفحة الرئيسية this.adapter.notifyDataSetChanged();