package cn.crane.framework.view.carouselview; import java.util.ArrayList; import java.util.List; import cn.crane.application.greenlife.App; import cn.crane.application.greenlife.R; import cn.crane.framework.adapter.PageItemAdapter; import cn.crane.framework.view.smartimage.SmartImageView; import android.content.Context; import android.os.Handler; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.RadioGroup; import android.widget.RelativeLayout; /** * * @author Ruifeng.yu Email:xyyh0116@aliyun.com * * @date Jun 8, 2015 */ public class CarouselView extends FrameLayout { private static final int MSG_CHANGE_IMAGE = 1000; private static final int TIME_SPAN = 6 * 1000; private View baseView; private ViewPager viewPager; private LinearLayout llDots; private ArrayList<View> arrViews = new ArrayList<View>(); private Context context; private PageItemAdapter pageItemAdapter; private int iCurrentPage; private List<CarouselItemInfo> arrCarouselItemInfos; private OnItemListener onItemListener; public void setOnItemListener(OnItemListener onItemListener) { this.onItemListener = onItemListener; } public CarouselView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } public CarouselView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public CarouselView(Context context) { super(context); initView(context); } public void setArrPictureInfos(List<CarouselItemInfo> arrPictureInfos) { // this.arrPictureInfos.clear(); // this.arrPictureInfos.addAll(arrPictureInfos); if (arrPictureInfos == null || arrPictureInfos.size() == 0) { setVisibility(View.GONE); } else { this.arrCarouselItemInfos = arrPictureInfos; initViewPager(); setVisibility(View.VISIBLE); } } private void initView(Context context) { this.context = context; baseView = LayoutInflater.from(context).inflate(R.layout.view_pictures, this); viewPager = (ViewPager) baseView.findViewById(R.id.viewPager); llDots = (LinearLayout) baseView.findViewById(R.id.ll_dots); } private void initViewPager() { if (arrCarouselItemInfos == null) { clearViewPager(); return; } setVisibility(View.VISIBLE); arrViews.clear(); RadioGroup.LayoutParams paramsGroup = new RadioGroup.LayoutParams( RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT); paramsGroup.gravity = Gravity.CENTER_HORIZONTAL; llDots.removeAllViews(); for (int i = 0; i < arrCarouselItemInfos.size(); i++) { SmartImageView iv = new SmartImageView(context); iv.setScaleType(ScaleType.CENTER_CROP); iv.setId(i); iv.setTag(i); iv.setOnClickListener(mClick); // iv.setImageUrl(arrImageUrls[i]); iv.setImageUrl(arrCarouselItemInfos.get(i).getImageUrl(), arrCarouselItemInfos .get(i).getDefaultResourse()); arrViews.add(iv); RelativeLayout rl = new RelativeLayout(context); android.widget.RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT); layoutParam.addRule(RelativeLayout.CENTER_VERTICAL); ImageView dot = new ImageView(context); dot.setId(i); if (i == 0) { dot.setImageResource(R.drawable.dot_wihte); } else { dot.setImageResource(R.drawable.dot_green); } rl.addView(dot, layoutParam); rl.setPadding(0, 0, (int) (13 * App.fDensity), 0); llDots.addView(rl); } pageItemAdapter = new PageItemAdapter(arrViews); viewPager.setAdapter(pageItemAdapter); viewPager.setOnPageChangeListener(mPageChange); initPage(); mHandler.sendEmptyMessageDelayed(MSG_CHANGE_IMAGE, TIME_SPAN); } private void initPage() { if (arrCarouselItemInfos == null) return; for (int i = 0; i < arrCarouselItemInfos.size(); i++) { if (iCurrentPage == i) ((ImageView) llDots.findViewById(i)) .setImageResource(R.drawable.dot_wihte); else ((ImageView) llDots.findViewById(i)) .setImageResource(R.drawable.dot_green); } } private OnPageChangeListener mPageChange = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { iCurrentPage = arg0; initPage(); if (onItemListener != null) { onItemListener.onItemChanged(arg0); } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }; OnClickListener mClick = new OnClickListener() { @Override public void onClick(View v) { try { if (arrCarouselItemInfos != null) { int position = v.getId(); CarouselItemInfo pictureInfo = arrCarouselItemInfos.get(position); if (onItemListener != null) { onItemListener.onItemClick(pictureInfo); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case MSG_CHANGE_IMAGE: if (arrCarouselItemInfos != null && arrCarouselItemInfos.size() > 0) { iCurrentPage = (iCurrentPage + 1) % arrCarouselItemInfos.size(); viewPager.setCurrentItem(iCurrentPage); mHandler.removeMessages(MSG_CHANGE_IMAGE); mHandler.sendEmptyMessageDelayed(MSG_CHANGE_IMAGE, TIME_SPAN); } break; default: break; } }; }; public void clearViewPager() { mHandler.removeMessages(MSG_CHANGE_IMAGE); if (arrViews != null) { arrViews.clear(); } if (llDots != null) { llDots.removeAllViews(); } // pageItemAdapter = new PageItemAdapter(arrViews); // viewPager.setAdapter(null); viewPager.removeAllViews(); viewPager.setOnPageChangeListener(null); } public interface OnItemListener { public void onItemClick(CarouselItemInfo pictureInfo); public void onItemChanged(int position); } }