项目中用到的轮播图片效果

自定义一个view实现轮播效果,代码如下:

/*
 * 首页轮播图
 */
public class ImageCycleView extends LinearLayout {
   ACache mCache;
   /**
    * 上下文
    */
   private Context mContext;

   /**
    * 图片轮播视图
    */
   private ViewPager mAdvPager = null;

   /**
    * 滚动图片视图适配器
    */
   private ImageCycleAdapter mAdvAdapter;

   /**
    * 图片轮播指示器控件
    */
   private ViewGroup mGroup;

   /**
    * 图片轮播指示器-个图
    */
   private ImageView mImageView = null;

   /**
    * 滚动图片指示器-视图列表
    */
   private ImageView[] mImageViews = null;

   /**
    * 图片滚动当前图片下标
    */
   private int mImageIndex = 0;

   /**
    * 手机密度
    */
   private float mScale;

   /**
    * @param context
    */
   public ImageCycleView(Context context) {
      super(context);
   }

   /**
    * @param context
    * @param attrs
    */
   public ImageCycleView(Context context, AttributeSet attrs) {
      super(context, attrs);
      mContext = context;
      mScale = context.getResources().getDisplayMetrics().density;
      LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this);
      mAdvPager = (ViewPager) findViewById(R.id.adv_pager);
      mAdvPager.setOnPageChangeListener(new GuidePageChangeListener());
      mAdvPager.setOnTouchListener(new OnTouchListener() {

         @Override
         public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
               // 开始图片滚动
               startImageTimerTask();
               break;
            default:
               // 停止图片滚动
               stopImageTimerTask();
               break;
            }
            return false;
         }
      });
      // 滚动图片右下指示器视图
      mGroup = (ViewGroup) findViewById(R.id.viewGroup);
      mCache = ACache.get(mContext);
   }

   /**
    * 装填图片数据
    * 
    * @param imageUrlList
    * @param imageCycleViewListener
    */
   public void setImageResources(ArrayList<String> imageUrlList,
         ImageCycleViewListener imageCycleViewListener) {
      // 清除所有子视图
      mGroup.removeAllViews();
      // 图片广告数量
      final int imageCount = imageUrlList.size();
      if(imageCount>1){
         mImageViews = new ImageView[imageCount];
         for (int i = 0; i < imageCount; i++) {

            LayoutParams margin = new LayoutParams(
                  LayoutParams.WRAP_CONTENT,
                  LayoutParams.WRAP_CONTENT);
            // 设置每个小圆点距离左边的间距
            margin.setMargins(10, 0, 0, 0);
            mImageView = new ImageView(mContext);
            // 设置每个小圆点的宽和高
            mImageView.setLayoutParams(new LayoutParams(15, 15));
            mImageViews[i] = mImageView;
            if (i == 0) {
               mImageViews[i]
                     .setBackgroundResource(R.mipmap.page_indicator_focused);
            } else {
               mImageViews[i]
                     .setBackgroundResource(R.mipmap.page_indicator_unfocused);
            }
            mGroup.addView(mImageViews[i], margin);
         }
      }
      
      
      mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList,
            imageCycleViewListener);
      mAdvPager.setAdapter(mAdvAdapter);
      startImageTimerTask();
   }

   /**
    * 开始轮播(手动控制自动轮播与否,便于资源控制)
    */
   public void startImageCycle() {
      startImageTimerTask();
   }

   /**
    * 暂停轮播——用于节省资源
    */
   public void pushImageCycle() {
      stopImageTimerTask();
   }

   /**
    * 开始图片滚动任务
    */
   private void startImageTimerTask() {
      stopImageTimerTask();
      // 图片每3秒滚动一次
      mHandler.postDelayed(mImageTimerTask, 5000);
   }

   /**
    * 停止图片滚动任务
    */
   private void stopImageTimerTask() {
      mHandler.removeCallbacks(mImageTimerTask);
   }

   private Handler mHandler = new Handler();

   /**
    * 图片自动轮播Task
    */
   private Runnable mImageTimerTask = new Runnable() {

      @Override
      public void run() {
         if (mImageViews != null) {
            // 下标等于图片列表长度说明已滚动到最后一张图片,重置下标
            if ((++mImageIndex) == mImageViews.length) {
               mImageIndex = 0;
            }
            mAdvPager.setCurrentItem(mImageIndex);
         }
      }
   };

   /**
    * 轮播图片状态监听器
    * 
    * @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) {
         // 设置当前显示的图片下标
         mImageIndex = index;
         // 设置图片滚动指示器背景
         mImageViews[index]
               .setBackgroundResource(R.mipmap.page_indicator_focused);
         for (int i = 0; i < mImageViews.length; i++) {
            if (index != i) {
               mImageViews[i]
                     .setBackgroundResource(R.mipmap.page_indicator_unfocused);
            }
         }

      }

   }

   private class ImageCycleAdapter extends PagerAdapter {

      /**
       * 图片视图缓存列表
       */
      private ArrayList<ImageView> mImageViewCacheList;

      /**
       * 图片资源列表
       */
      private ArrayList<String> mAdList = new ArrayList<String>();

      /**
       * 广告图片点击监听器
       */
      private ImageCycleViewListener mImageCycleViewListener;

      private Context mContext;

      public ImageCycleAdapter(Context context, ArrayList<String> adList,
            ImageCycleViewListener imageCycleViewListener) {
         mContext = context;
         mAdList = adList;
         mImageCycleViewListener = imageCycleViewListener;
         mImageViewCacheList = new ArrayList<ImageView>();
      }

      @Override
      public int getCount() {
         return mAdList.size();
      }

      @Override
      public boolean isViewFromObject(View view, Object obj) {
         return view == obj;
      }

      @Override
      public Object instantiateItem(ViewGroup container, final int position) {
         String imageUrl = mAdList.get(position);
         ImageView imageView = null;
         if (mImageViewCacheList.isEmpty()) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new LayoutParams(
                  LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);

         } else {
            imageView = mImageViewCacheList.remove(0);
         }
         /*// 设置图片点击监听
         imageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
               //轮播图的点击事件
               HomeEntity homeInfo = (HomeEntity) mCache.getAsObject("homeInfo");          
               List<HomeFocusPic> focusList =homeInfo.getFlist();
            if (!focusList.get(position).getUrl().equals("javascript:void(0);")) {
               //打开webview
               Intent intent = new Intent(mContext, WebAct.class);
               intent.putExtra("url", focusList.get(position).getUrl());
               App.gotoActivity(mContext, intent);
            };

               
            }
         });*/
         imageView.setTag(imageUrl);
         
         container.addView(imageView);
         mImageCycleViewListener.displayImage(imageUrl, imageView);
         return imageView;
         }

      @Override
      public void destroyItem(ViewGroup container, int position, Object object) {
         ImageView view = (ImageView) object;
         container.removeView(view);
         mImageViewCacheList.add(view);
         // ((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);  
      }

   }

   /**
    * 轮播控件的监听事件
    * 
    * @author minking
    */
   public static interface ImageCycleViewListener {

      /**
       * 加载图片资源
       * 
       * @param imageURL
       * @param imageView
       */
      public void displayImage(String imageURL, ImageView imageView);

      /**
       * 单击图片事件
       * 
       * @param position
       * @param imageView
       */
      public void onImageClick(int position, View imageView);
   }
}
用法如下:
private ImageCycleView viewPager;//轮播控件
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext=this;
    viewPager = (ImageCycleView) findViewById(R.id.vp_first_image);
 }

@Override
public void onResume() {
    super.onResume();
    //开启轮播图
    viewPager.startImageCycle();
}

@Override
public void onPause() {
    super.onPause();
    //暂停轮播图
    viewPager.pushImageCycle();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //关闭轮播图
    viewPager.pushImageCycle();
}

private ImageCycleView.ImageCycleViewListener mAdCycleViewListener = new ImageCycleView.ImageCycleViewListener() {

    @Override
    public void onImageClick(int position, View imageView) {
        // 单击图片处理事件,webview
    }

    @Override
    public void displayImage(String imageURL, ImageView imageView) {
         //此处用到ImageLoader进行加载图片
         ImageLoaderUtils.ImageLoader(MainActivity.this, imageURL, imageView);// 使用了ImageLoader对图片进行加装!
    }
};
//将请求下来的图片加载到轮播控件中 imgUrlList 图片路径集合
viewPager.setImageResources(imgUrlList, mAdCycleViewListener);



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值