开源项目之UniversalImageLoader(异步加载大量图片)

来源:互联网 发布:python 任务计划 编辑:程序博客网 时间:2024/06/05 17:59

    UniversalImageLoader是实现异步加载大量图片的源码和例子,包括缓存、硬盘缓存、容错机制等技术。

 项目如图:

测试效果如图:


总共有四种格式效果!

第一种ImageList,效果如图:


关键测试代码如下:

[java] view plaincopy
  1. public class ImageListActivity extends BaseActivity  
  2. {  
  3.   
  4.     private String[] imageUrls;  
  5.   
  6.     private DisplayImageOptions options;  
  7.   
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState)  
  10.     {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.ac_image_list);  
  13.   
  14.         Bundle bundle = getIntent().getExtras();  
  15.         imageUrls = bundle.getStringArray(Extra.IMAGES);  
  16.   
  17.         options = new DisplayImageOptions.Builder()  
  18.                 .showStubImage(R.drawable.stub_image).cacheInMemory()  
  19.                 .cacheOnDisc().build();  
  20.   
  21.         ListView listView = (ListView) findViewById(android.R.id.list);  
  22.         listView.setAdapter(new ItemAdapter());  
  23.         listView.setOnItemClickListener(new OnItemClickListener()  
  24.         {  
  25.             @Override  
  26.             public void onItemClick(AdapterView<?> parent, View view,  
  27.                     int position, long id)  
  28.             {  
  29.                 startImageGalleryActivity(position);  
  30.             }  
  31.         });  
  32.     }  
  33.   
  34.     @Override  
  35.     protected void onStop()  
  36.     {  
  37.         imageLoader.stop();  
  38.         super.onStop();  
  39.     }  
  40.   
  41.     private void startImageGalleryActivity(int position)  
  42.     {  
  43.         Intent intent = new Intent(this, ImagePagerActivity.class);  
  44.         intent.putExtra(Extra.IMAGES, imageUrls);  
  45.         intent.putExtra(Extra.IMAGE_POSITION, position);  
  46.         startActivity(intent);  
  47.     }  
  48.   
  49.     class ItemAdapter extends BaseAdapter  
  50.     {  
  51.   
  52.         private class ViewHolder  
  53.         {  
  54.             public TextView text;  
  55.             public ImageView image;  
  56.         }  
  57.   
  58.         @Override  
  59.         public int getCount()  
  60.         {  
  61.             return imageUrls.length;  
  62.         }  
  63.   
  64.         @Override  
  65.         public Object getItem(int position)  
  66.         {  
  67.             return position;  
  68.         }  
  69.   
  70.         @Override  
  71.         public long getItemId(int position)  
  72.         {  
  73.             return position;  
  74.         }  
  75.   
  76.         @Override  
  77.         public View getView(final int position, View convertView,  
  78.                 ViewGroup parent)  
  79.         {  
  80.             View view = convertView;  
  81.             final ViewHolder holder;  
  82.             if (convertView == null)  
  83.             {  
  84.                 view = getLayoutInflater().inflate(R.layout.item_list_image,  
  85.                         null);  
  86.                 holder = new ViewHolder();  
  87.                 holder.text = (TextView) view.findViewById(R.id.text);  
  88.                 holder.image = (ImageView) view.findViewById(R.id.image);  
  89.                 view.setTag(holder);  
  90.             } else  
  91.                 holder = (ViewHolder) view.getTag();  
  92.   
  93.             holder.text.setText("Item " + position);  
  94.   
  95.             imageLoader  
  96.                     .displayImage(imageUrls[position], holder.image, options);  
  97.   
  98.             return view;  
  99.         }  
  100.     }  
  101. }  

第二种ImageGrid效果!如图:


测试关键代码如下:

[java] view plaincopy
  1. public class ImageGridActivity extends BaseActivity  
  2. {  
  3.   
  4.     private String[] imageUrls;  
  5.   
  6.     private DisplayImageOptions options;  
  7.   
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState)  
  10.     {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.ac_image_grid);  
  13.   
  14.         Bundle bundle = getIntent().getExtras();  
  15.         imageUrls = bundle.getStringArray(Extra.IMAGES);  
  16.   
  17.         options = new DisplayImageOptions.Builder()  
  18.                 .showStubImage(R.drawable.stub_image)  
  19.                 .showImageForEmptyUri(R.drawable.image_for_empty_url)  
  20.                 .cacheInMemory().cacheOnDisc().build();  
  21.   
  22.         GridView gridView = (GridView) findViewById(R.id.gridview);  
  23.         gridView.setAdapter(new ImageAdapter());  
  24.         gridView.setOnItemClickListener(new OnItemClickListener()  
  25.         {  
  26.             @Override  
  27.             public void onItemClick(AdapterView<?> parent, View view,  
  28.                     int position, long id)  
  29.             {  
  30.                 startImageGalleryActivity(position);  
  31.             }  
  32.         });  
  33.     }  
  34.   
  35.     @Override  
  36.     protected void onStop()  
  37.     {  
  38.         imageLoader.stop();  
  39.         super.onStop();  
  40.     }  
  41.   
  42.     private void startImageGalleryActivity(int position)  
  43.     {  
  44.         Intent intent = new Intent(this, ImagePagerActivity.class);  
  45.         intent.putExtra(Extra.IMAGES, imageUrls);  
  46.         intent.putExtra(Extra.IMAGE_POSITION, position);  
  47.         startActivity(intent);  
  48.     }  
  49.   
  50.     public class ImageAdapter extends BaseAdapter  
  51.     {  
  52.         @Override  
  53.         public int getCount()  
  54.         {  
  55.             return imageUrls.length;  
  56.         }  
  57.   
  58.         @Override  
  59.         public Object getItem(int position)  
  60.         {  
  61.             return null;  
  62.         }  
  63.   
  64.         @Override  
  65.         public long getItemId(int position)  
  66.         {  
  67.             return position;  
  68.         }  
  69.   
  70.         @Override  
  71.         public View getView(int position, View convertView, ViewGroup parent)  
  72.         {  
  73.             final ImageView imageView;  
  74.             if (convertView == null)  
  75.             {  
  76.                 imageView = (ImageView) getLayoutInflater().inflate(  
  77.                         R.layout.item_grid_image, parent, false);  
  78.             } else  
  79.             {  
  80.                 imageView = (ImageView) convertView;  
  81.             }  
  82.   
  83.             imageLoader.displayImage(imageUrls[position], imageView, options,  
  84.                     new SimpleImageLoadingListener()  
  85.                     {  
  86.                         @Override  
  87.                         public void onLoadingComplete()  
  88.                         {  
  89.                             Animation anim = AnimationUtils.loadAnimation(  
  90.                                     ImageGridActivity.this, R.anim.fade_in);  
  91.                             imageView.setAnimation(anim);  
  92.                             anim.start();  
  93.                         }  
  94.                     });  
  95.   
  96.             return imageView;  
  97.         }  
  98.     }  
  99. }  

第三种ImagePager效果,如图:


测试关键实现如下:

[java] view plaincopy
  1. public class ImagePagerActivity extends BaseActivity  
  2. {  
  3.   
  4.     private ViewPager pager;  
  5.   
  6.     private DisplayImageOptions options;  
  7.   
  8.     public void onCreate(Bundle savedInstanceState)  
  9.     {  
  10.         super.onCreate(savedInstanceState);  
  11.   
  12.         setContentView(R.layout.ac_image_pager);  
  13.         Bundle bundle = getIntent().getExtras();  
  14.         String[] imageUrls = bundle.getStringArray(Extra.IMAGES);  
  15.         int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);  
  16.   
  17.         options = new DisplayImageOptions.Builder()  
  18.                 .showImageForEmptyUri(R.drawable.image_for_empty_url)  
  19.                 .cacheOnDisc().imageScaleType(ImageScaleType.EXACT).build();  
  20.   
  21.         pager = (ViewPager) findViewById(R.id.pager);  
  22.         pager.setAdapter(new ImagePagerAdapter(imageUrls));  
  23.         pager.setCurrentItem(pagerPosition);  
  24.     }  
  25.   
  26.     @Override  
  27.     protected void onStop()  
  28.     {  
  29.         imageLoader.stop();  
  30.         super.onStop();  
  31.     }  
  32.   
  33.     private class ImagePagerAdapter extends PagerAdapter  
  34.     {  
  35.   
  36.         private String[] images;  
  37.         private LayoutInflater inflater;  
  38.   
  39.         ImagePagerAdapter(String[] images)  
  40.         {  
  41.             this.images = images;  
  42.             inflater = getLayoutInflater();  
  43.         }  
  44.   
  45.         @Override  
  46.         public void destroyItem(View container, int position, Object object)  
  47.         {  
  48.             ((ViewPager) container).removeView((View) object);  
  49.         }  
  50.   
  51.         @Override  
  52.         public void finishUpdate(View container)  
  53.         {  
  54.         }  
  55.   
  56.         @Override  
  57.         public int getCount()  
  58.         {  
  59.             return images.length;  
  60.         }  
  61.   
  62.         @Override  
  63.         public Object instantiateItem(View view, int position)  
  64.         {  
  65.             final FrameLayout imageLayout = (FrameLayout) inflater.inflate(  
  66.                     R.layout.item_pager_image, null);  
  67.             final ImageView imageView = (ImageView) imageLayout  
  68.                     .findViewById(R.id.image);  
  69.             final ProgressBar spinner = (ProgressBar) imageLayout  
  70.                     .findViewById(R.id.loading);  
  71.   
  72.             imageLoader.displayImage(images[position], imageView, options,  
  73.                     new ImageLoadingListener()  
  74.                     {  
  75.                         @Override  
  76.                         public void onLoadingStarted()  
  77.                         {  
  78.                             spinner.setVisibility(View.VISIBLE);  
  79.                         }  
  80.   
  81.                         @Override  
  82.                         public void onLoadingFailed(FailReason failReason)  
  83.                         {  
  84.                             String message = null;  
  85.                             switch (failReason)  
  86.                             {  
  87.                             case IO_ERROR:  
  88.                                 message = "Input/Output error";  
  89.                                 break;  
  90.                             case OUT_OF_MEMORY:  
  91.                                 message = "Out Of Memory error";  
  92.                                 break;  
  93.                             case UNKNOWN:  
  94.                                 message = "Unknown error";  
  95.                                 break;  
  96.                             }  
  97.                             Toast.makeText(ImagePagerActivity.this, message,  
  98.                                     Toast.LENGTH_SHORT).show();  
  99.   
  100.                             spinner.setVisibility(View.GONE);  
  101.                             imageView  
  102.                                     .setImageResource(android.R.drawable.ic_delete);  
  103.                         }  
  104.   
  105.                         @Override  
  106.                         public void onLoadingComplete()  
  107.                         {  
  108.                             spinner.setVisibility(View.GONE);  
  109.                             Animation anim = AnimationUtils.loadAnimation(  
  110.                                     ImagePagerActivity.this, R.anim.fade_in);  
  111.                             imageView.setAnimation(anim);  
  112.                             anim.start();  
  113.                         }  
  114.   
  115.                         @Override  
  116.                         public void onLoadingCancelled()  
  117.                         {  
  118.                             // Do nothing  
  119.                         }  
  120.                     });  
  121.   
  122.             ((ViewPager) view).addView(imageLayout, 0);  
  123.             return imageLayout;  
  124.         }  
  125.   
  126.         @Override  
  127.         public boolean isViewFromObject(View view, Object object)  
  128.         {  
  129.             return view.equals(object);  
  130.         }  
  131.   
  132.         @Override  
  133.         public void restoreState(Parcelable state, ClassLoader loader)  
  134.         {  
  135.         }  
  136.   
  137.         @Override  
  138.         public Parcelable saveState()  
  139.         {  
  140.             return null;  
  141.         }  
  142.   
  143.         @Override  
  144.         public void startUpdate(View container)  
  145.         {  
  146.         }  
  147.     }  
  148. }  

第四种ImageGallery效果如图:


测试关键代码:

[java] view plaincopy
  1. public class ImageGalleryActivity extends BaseActivity  
  2. {  
  3.   
  4.     private Gallery gallery;  
  5.   
  6.     private DisplayImageOptions options;  
  7.   
  8.     public void onCreate(Bundle savedInstanceState)  
  9.     {  
  10.         super.onCreate(savedInstanceState);  
  11.   
  12.         setContentView(R.layout.ac_image_gallery);  
  13.         Bundle bundle = getIntent().getExtras();  
  14.         String[] imageUrls = bundle.getStringArray(Extra.IMAGES);  
  15.         int galleryPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);  
  16.   
  17.         options = new DisplayImageOptions.Builder()  
  18.                 .showImageForEmptyUri(R.drawable.image_for_empty_url)  
  19.                 .showStubImage(R.drawable.stub_image).cacheInMemory()  
  20.                 .cacheOnDisc().build();  
  21.   
  22.         gallery = (Gallery) findViewById(R.id.gallery);  
  23.         gallery.setAdapter(new ImagePagerAdapter(imageUrls));  
  24.         gallery.setSelection(galleryPosition);  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void onStop()  
  29.     {  
  30.         imageLoader.stop();  
  31.         super.onStop();  
  32.     }  
  33.   
  34.     private class ImagePagerAdapter extends BaseAdapter  
  35.     {  
  36.   
  37.         private String[] images;  
  38.         private LayoutInflater inflater;  
  39.   
  40.         ImagePagerAdapter(String[] images)  
  41.         {  
  42.             this.images = images;  
  43.             inflater = getLayoutInflater();  
  44.         }  
  45.   
  46.         @Override  
  47.         public int getCount()  
  48.         {  
  49.             return images.length;  
  50.         }  
  51.   
  52.         @Override  
  53.         public Object getItem(int position)  
  54.         {  
  55.             return position;  
  56.         }  
  57.   
  58.         @Override  
  59.         public long getItemId(int position)  
  60.         {  
  61.             return position;  
  62.         }  
  63.   
  64.         @Override  
  65.         public View getView(int position, View convertView, ViewGroup parent)  
  66.         {  
  67.             ImageView imageView = (ImageView) convertView;  
  68.             if (imageView == null)  
  69.             {  
  70.                 imageView = (ImageView) inflater.inflate(  
  71.                         R.layout.item_gallery_image, parent, false);  
  72.             }  
  73.             imageLoader.displayImage(images[position], imageView, options);  
  74.             return imageView;  
  75.         }  
  76.     }  
  77. }  

实例中通过imageLoader成员负责图片操作!初始化如下:

[java] view plaincopy
  1. protected ImageLoader imageLoader = ImageLoader.getInstance();  

此处主要是围绕UniversalImageLoader使用的介绍!~代码不难。

学习的目标是成熟!~

项目下载

0 0
原创粉丝点击