轮播图效果
2016-05-25 14:28
357 查看
package com.usung.smarttradetwo.widgets; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; 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 com.bumptech.glide.Glide; import com.usung.smarttradetwo.R; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * ViewPager实现的轮播图广告自定义视图,如京东首页的广告轮播图效果; * 既支持自动轮播页面也支持手势滑动切换页面 * @author caizhiming * */ public class SlideShowView extends FrameLayout { //轮播图图片数量 private int IMAGE_COUNT = 0; //自动轮播的时间间隔 private final static int TIME_INTERVAL = 5; //自动轮播启用开关 private final static boolean isAutoPlay = true; private OnImageOnClickListener onImageOnClickListener=null; //自定义轮播图的资源ID private int[] imagesResIds; //自定义轮播图的资源ID private String[] imagesUrls; //自定义轮播图的资源ID private ArrayList<String> imagesPaths; //放轮播图片的ImageView 的list private List<ImageView> imageViewsList; // 存放轮播图片的bitmap集合 private ArrayList<Bitmap> bitmaps; //放圆点的View的list private List<View> dotViewsList; //上下文 private Context context; private int m_type=0; private ViewPager viewPager; //当前轮播页 private int currentItem = 0; //定时任务 private ScheduledExecutorService scheduledExecutorService; //Handler private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); viewPager.setCurrentItem(currentItem); } }; public SlideShowView(Context context) { this(context,null); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub this.context=context; } /** * 开始轮播图切换 */ private void startPlay(){ scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 8, TimeUnit.SECONDS); } /** * 停止轮播图切换 */ private void stopPlay(){ scheduledExecutorService.shutdown(); } /** * 初始化相关Data */ public void setData(int[] imagesResIds){ m_type=0; this.imagesResIds=imagesResIds; IMAGE_COUNT=imagesResIds.length; initUI(); } /** * 初始化相关Data */ public void setData(String[] imagesUrls){ m_type=1; this.imagesUrls=imagesUrls; IMAGE_COUNT=imagesUrls.length; initUI(); } /** * 初始化相关Data */ public void setData(ArrayList<String> imagesPaths){ m_type=2; this.imagesPaths=imagesPaths; this.imagesPaths.remove(""); IMAGE_COUNT=imagesPaths.size(); initUI(); } /** * 初始化相关Data */ public void setDataBitmap(ArrayList<Bitmap> bitmaps){ m_type=2; this.bitmaps = bitmaps; // this.imagesPaths.remove(""); IMAGE_COUNT=bitmaps.size(); initUI(); } /** * 初始化Views等UI */ private void initUI(){ imageViewsList = new ArrayList<ImageView>(); dotViewsList = new ArrayList<View>(); View content_viewView = LayoutInflater.from(context).inflate(R.layout.viewpager_ad_carousel, this, true); LinearLayout dotLayout = (LinearLayout)content_viewView.findViewById(R.id.dotLayout); dotLayout.removeAllViews(); for (int i = 0; i < IMAGE_COUNT; i++) { ImageView view = new ImageView(context); if(m_type==0){ view.setImageResource(imagesResIds[i]); }else if(m_type==1){ Glide.with(context).load(imagesUrls[i]).into(view); // ImageLoader.getInstance().displayImage(imagesUrls[i], view); }else { Glide.with(context).load(imagesPaths.get(i)).into(view); // ImageLoader.getInstance().displayImage(imagesPaths.get(i), view); } view.setScaleType(ScaleType.FIT_XY); view.setOnClickListener(new MyOnClick(i)); imageViewsList.add(view); ImageView dotView = new ImageView(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT,android.view.ViewGroup.LayoutParams.WRAP_CONTENT); params.leftMargin = 4; params.rightMargin = 4; dotLayout.addView(dotView, params); dotViewsList.add(dotView); } viewPager = (ViewPager) content_viewView.findViewById(R.id.viewPager); viewPager.setFocusable(true); viewPager.setAdapter(new MyPagerAdapter()); viewPager.setOnPageChangeListener(new MyPageChangeListener()); if(isAutoPlay){ startPlay(); } } /** * image的点击事件 * @author lijian * */ private class MyOnClick implements OnClickListener { private int position=0; public MyOnClick(int position){ this.position=position; } @Override public void onClick(View v) { // TODO Auto-generated method stub if(onImageOnClickListener!=null){ onImageOnClickListener.onclick(v,position); } } } /** * 填充ViewPager的页面适配器 * @author caizhiming */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub //((ViewPag.er)container).removeView((View)object); ((ViewPager)container).removeView(imageViewsList.get(position)); } @Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(imageViewsList.get(position)); return imageViewsList.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return imageViewsList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } } /** * ViewPager的监听器 * 当ViewPager中页面的状态发生改变时调用 * @author caizhiming */ private class MyPageChangeListener implements OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub switch (arg0) { case 1:// 手势滑动,空闲中 isAutoPlay = false; break; case 2:// 界面切换中 isAutoPlay = true; break; case 0:// 滑动结束,即切换完毕或者加载完毕 // 当前为最后一张,此时从右向左滑,则切换到第一张 if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); } // 当前为第一张,此时从左向右滑,则切换到最后一张 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1); } break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int pos) { // TODO Auto-generated method stub currentItem = pos; for(int i=0;i < dotViewsList.size();i++){ if(i == pos){ ((View)dotViewsList.get(pos)).setBackgroundResource(R.mipmap.dot_red); }else { ((View)dotViewsList.get(i)).setBackgroundResource(R.mipmap.dot_white); } } } } /** *执行轮播图切换任务 *@author caizhiming */ private class SlideShowTask implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (viewPager) { currentItem = (currentItem+1)%imageViewsList.size(); handler.obtainMessage().sendToTarget(); } } } /** * 销毁ImageView资源,回收内存 * @author caizhiming */ private void destoryBitmaps() { for (int i = 0; i < IMAGE_COUNT; i++) { ImageView imageView = imageViewsList.get(i); Drawable drawable = imageView.getDrawable(); if (drawable != null) { //解除drawable对view的引用 drawable.setCallback(null); } } } // 以下两个方法给图片设置点击事件 public void setOnImageOnClick(OnImageOnClickListener onImageOnClickListener){ this.onImageOnClickListener=onImageOnClickListener; } public interface OnImageOnClickListener{ public void onclick(View view, int position); } }
相关文章推荐
- C/C++中unsigned char和char的区别
- G.Interference Signal---河南省第八届程序设计大赛(dp)
- px
- 跨域资源共享CORS
- 数据库知识点2
- [剑指offer]二叉搜索树的第k个结点
- Android中的windowSoftInputMode属性详解
- Spring缓存注解@Cache使用
- 网页设计中常用的19个Web安全字体
- 垃圾回收(GC)的三种基本方式
- c++与java互相进行3des加解密
- 10 11周 补充 项目二(2)
- enable_share_from_this
- 【Latex】Latex小白入门(3)——Latex中的特殊格式
- iOS学习之——SDWebImage
- 图片转换工具类BitmapFactory的使用
- 大数据工具比较:R 语言和 Spark 谁更胜一筹?
- 各种网络数据(音乐下载,图片)
- nodejs的调试(node-inspector)
- .net跨域的数据请求