홈페이지 사진 캐러셀
/** * 광고 이미지 자동 회전 제어</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 /** * @ 매개변수 컨텍스트 */ 공개 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, mAdvPager = (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); // 그림의 오른쪽 하단 표시기 스크롤 mGroup = (ViewGroup) findViewById(R.id.viewGroup) } /** * 터치하면 타이머가 중지되고, 올리면 타이머가 시작됩니다.*/ @Override public boolean dispatchTouchEvent(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 int imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount] for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); LayoutParams=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 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 = new ImageCycleAdapter(mContext, imageUrlList,imageCycleViewListener); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } public void setImageResources2(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ this.stype=stype; // 이미지 광고 수 최종 정수 imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); LayoutParams params(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.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 무효 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; private Context mContext;// public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener imageCycleViewListener) {// this.mContext = context; // this.mAdList = adListener = imageCycleViewListener; 새로운 ArrayList<SmartImageView>();// } public ImageCycleAdapter(Context context, ArrayList<Integer> adList , ImageCycleViewListener imageCycleViewListener) { this.mContext = context; this.mAdList = adList; mImageCycleViewListener = imageCycleViewListener; ) } @오버라이드 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+""); SmartImageView imageView = null; if (mImageViewCacheList.isEmpty()) { imageView = new SmartImageView(mContext); .setLayoutParams(새 LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); } else { imageView.setTag(imageUrl); .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 destroyItem(ViewGroup 컨테이너, int 위치, 개체 개체) { SmartImageView 보기 = (SmartImageView) object; mImageViewCacheList.add(view); } } /** * 캐러셀 컨트롤에 대한 청취 이벤트* * @author minking */ public static 인터페이스 ImageCycleViewListener { /** * 사진을 클릭하세요. 이벤트 * * @param 위치 * @param imageView */ public void onImageClick(int position, 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;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는 ViewPager를 확장합니다. private String TAG = PageFlipper.class.getSimpleName(); views; PagerAdapter 어댑터 = new PagerAdapter() { @Override public Object instantiateItem(ViewGroup 컨테이너, int position) { View v = views.get(position); 컨테이너.addView(v); return v; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1 } @Override public int getItemPosition(Object object) views.indexOf(객체) } @Override public void destroyItem(ViewGroup 컨테이너, int 위치, 객체 객체) { Container.removeView((View)object) } @Override public int getCount() { return views == null ? 0 : views.size() } }; private OnPageChangeListener() { /** * 컨트롤 위치를 데이터 세트의 위치로 변환*/ 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 rates, int offset) { if(listener2 != null){ Listener2.onPageScrolled(convert(position), rates, offset) }; 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); } 스위치(상태) { Case SCROLL_STATE_IDLE: // 유휴 if(!handler.hasMessages(START_FLIPPING)) handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 스크롤 중단 지연; SCROLL_STATE_DRAGGING: // Handler.sendEmptyMessage(STOP_FLIPPING); // 스크롤 취소 break; // 드래그 종료 break; } } }, private final int STOP_FLIPPING = 1; { 공개 무효 핸들 메시지(메시지 메시지) { 스위치 (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); break; } } }; public PageFlipper(Context context, AttributeSet attrs) { super(context, attrs) } public PageFlipper(Context context); ; } 비공개 void init(){ setOffscreenPageLimit(1); 최대 페이지 캐시 수 setAdapter(adapter); // 어댑터 super.setOnPageChangeListener(listener); // 리스너 handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 지연된 스크롤} public void setViews(int[] views) this. new ArrayList<View>(); for(int i=0;i<ids.length+2;i++){ // 헤드에 마지막 페이지를 추가하고 끝에 홈 페이지를 추가합니다. iv = new ImageView(getContext())(ids[i == 0 ? ids.length-1 : ( i > ids. 길이 ? 0 : i-1 )]); iv.setScaleType(ImageView.ScaleType.FIT_XY); setCurrentItem(1); // 홈 페이지 this.adapter.notifyDataSetChanged(); } @Override public void setOnPageChangeListener(OnPageChangeListenerlistener) { this.listener2 = } }