Base


public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中
        ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));
    }
}

/**
 * 基类,提供共用的ImageLoader,共用的菜单
 * @author 白乾涛
 */
public abstract class BaseActivity extends Activity {
    protected ImageLoader imageLoader = ImageLoader.getInstance();
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item_clear_memory_cache:
            imageLoader.clearMemoryCache();//清除内存缓存
            return true;
        case R.id.item_clear_disc_cache:
            imageLoader.clearDiskCache();//清除磁盘缓存。建议使用clearDiskCache()。经查源码clearDiscCache中就一行代码,那就是调用clearDiskCache方法。
            return true;
        default:
            return false;
        }
    }
    @Override
    public void onBackPressed() {
        imageLoader.stop();
        super.onBackPressed();
    }
}

/**
 * 带有两个滑动控制菜单的基类,设置是否在滑动过程中、在猛的滑动界面的时候停止加载图片。适用于ListView或GridView
 * @author 白乾涛
 */
public class AbsListViewBaseActivity extends BaseActivity {
    protected static final String STATE_PAUSE_ON_SCROLL = "STATE_PAUSE_ON_SCROLL";
    protected static final String STATE_PAUSE_ON_FLING = "STATE_PAUSE_ON_FLING";
    protected AbsListView listView;
    /**滑动时是否暂停加载*/
    protected boolean pauseOnScroll = false;
    protected boolean pauseOnFling = true;
    @Override
    public void onResume() {
        super.onResume();
        //设置是否在滑动过程中、在猛的滑动界面的时候停止加载图片。
        listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(STATE_PAUSE_ON_SCROLL, pauseOnScroll);
        outState.putBoolean(STATE_PAUSE_ON_FLING, pauseOnFling);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false);
        pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true);
    }
    @Override
    //onCreateOptionsMenu只会在Menu显示之前去调用一次,之后就不会再去调用。
    //onPrepareOptionsMenu是每次在显示Menu之前都会去调用,只要按一次Menu按鍵,就会调用一次。所以可以在这里动态的改变menu。
    public boolean onPrepareOptionsMenu(Menu menu) {
        //menu.clear(); //如果没有clear而直接add的话,那么菜单中菜单项是会“追加”的
        MenuItem pauseOnScrollItem = menu.findItem(R.id.item_pause_on_scroll);
        pauseOnScrollItem.setVisible(true);
        pauseOnScrollItem.setChecked(pauseOnScroll);
        MenuItem pauseOnFlingItem = menu.findItem(R.id.item_pause_on_fling);
        pauseOnFlingItem.setVisible(true);
        pauseOnFlingItem.setChecked(pauseOnFling);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item_pause_on_scroll:
            pauseOnScroll = !pauseOnScroll;
            item.setChecked(pauseOnScroll);
            listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
            return true;
        case R.id.item_pause_on_fling:
            pauseOnFling = !pauseOnFling;
            item.setChecked(pauseOnFling);
            listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
            return true;
        default://默认调用父类的方法
            return super.onOptionsItemSelected(item);
        }
    }
}

ListView

public class ListViewActivity extends AbsListViewBaseActivity {
    private ViewHolder holder;
    private DisplayImageOptions options;
    private SimpleImageLoadingListener loadingListener;
    /**图片的地址*/
    private String[] imageUrls;
    /**记录所有已加载的URL*/
    private static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        imageUrls = getIntent().getExtras().getStringArray(Extra.IMAGES);
        options = new DisplayImageOptions.Builder()//
                .showImageOnLoading(R.drawable.ic_stub).showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error)//
                .cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).displayer(new CircleBitmapDisplayer(0xffff0000, 2)).build();//圆形描边
        loadingListener = new SimpleImageLoadingListener() {
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                //加载完图片后append图片宽高信息!注意:只能在回调中获取,在其他地方获取都是不靠谱的!
                if (loadedImage != null) {//加载失败时loadedImage可能为null
                    holder.text.append(loadedImage.getWidth() + " * " + loadedImage.getHeight());//Bitmap会被压缩后加载仅内存,然后ImageView会对其进行缩放
                    ((BaseAdapter) ((ListView) listView).getAdapter()).notifyDataSetChanged();//必须调用
                    //第一次加载时显示渐变动画
                    boolean firstDisplay = !displayedImages.contains(imageUri);
                    if (firstDisplay) {
                        FadeInBitmapDisplayer.animate((ImageView) view, 500);
                        displayedImages.add(imageUri);
                    }
                }
            }
        };
        //******************************************************************************************
        listView = new ListView(this);
        ((ListView) listView).setAdapter(new ItemAdapter());
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(ListViewActivity.this, ViewPagerActivity.class);
                intent.putExtra(Extra.IMAGES, imageUrls);
                intent.putExtra(Extra.IMAGE_POSITION, position);
                startActivity(intent);
            }
        });
        setContentView(listView);
    }
    @Override
    public void onBackPressed() {
        displayedImages.clear();
        super.onBackPressed();
    }
    //***********************************************************************************************************************************************
    private class ItemAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return imageUrls.length;
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.item_list_image, parent, false);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.text);
                holder.image = (ImageView) convertView.findViewById(R.id.image);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.text.setText(position + ":");//必须放在displayImage之前,否则会产生线程安全问题(直接导致loadingListener中无法append图片宽高信息)
            imageLoader.displayImage(imageUrls[position], holder.image, options, loadingListener);
            return convertView;
        }
    }
    //*********************************************************************************************************************************************
    private class ViewHolder {
        public TextView text;
        public ImageView image;
    }
}

ViewPage

public class ViewPagerActivity extends BaseActivity {
    private static final String STATE_POSITION = "STATE_POSITION";//初始位置
    private DisplayImageOptions options;
    private ViewPager pager;
    private String[] imageUrls;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getIntent().getExtras();
        if (getIntent() == null || getIntent().getExtras() == null) {
            finish();
        }
        imageUrls = bundle.getStringArray(Extra.IMAGES);
        int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
        if (savedInstanceState != null) {
            pagerPosition = savedInstanceState.getInt(STATE_POSITION);
        }
        options = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_empty).showImageOnFail(R.drawable.ic_error)
                .resetViewBeforeLoading(true).cacheOnDisk(true).imageScaleType(ImageScaleType.EXACTLY).bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(true).displayer(new FadeInBitmapDisplayer(300)).build();
        pager = new ViewPager(this);
        pager.setAdapter(new ImagePagerAdapter());
        pager.setCurrentItem(pagerPosition);
        setContentView(pager);
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(STATE_POSITION, pager.getCurrentItem());
    }
    //******************************************************************************************
    private class ImagePagerAdapter extends PagerAdapter {
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
        @Override
        public int getCount() {
            return imageUrls.length;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }
        @Override
        public Object instantiateItem(ViewGroup view, int position) {
            View imageLayout = LayoutInflater.from(ViewPagerActivity.this).inflate(R.layout.item_pager_image, view, false);
            ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image);
            final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);
            imageLoader.displayImage(imageUrls[position], imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    spinner.setVisibility(View.VISIBLE);
                }
                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason.getType()) {//加载失败原因
                    case IO_ERROR:
                        message = "Input/Output error";
                        break;
                    case DECODING_ERROR:
                        message = "Image can't be decoded";
                        break;
                    case NETWORK_DENIED:
                        message = "Downloads are denied";
                        break;
                    case OUT_OF_MEMORY:
                        message = "Out Of Memory error";
                        break;
                    case UNKNOWN:
                        message = "Unknown error";
                        break;
                    }
                    Toast.makeText(ViewPagerActivity.this, message, Toast.LENGTH_SHORT).show();
                    spinner.setVisibility(View.GONE);
                }
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    spinner.setVisibility(View.GONE);
                }
            });
            view.addView(imageLayout, 0);
            return imageLayout;
        }
    }
}

公司封装的工具类

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.widget.ImageView;
import com.lokinfo.m95xiu.application.LokApp;
import com.lokinfo.m95xiu.util.M95Log;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class ImageHelper {
    public static void init(Context context){
        
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
        .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
        .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
        .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
        .bitmapConfig(Config.RGB_565)//设置图片的解码类型//  
        .build();//构建完成  
        
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context.getApplicationContext())  
        .memoryCacheExtraOptions(480, 800) 
        .threadPoolSize(3)//线程池内加载的数量  
        .threadPriority(Thread.NORM_PRIORITY)  
        .denyCacheImageMultipleSizesInMemory()
        .tasksProcessingOrder(QueueProcessingType.FIFO)  
        .defaultDisplayImageOptions(options)
        .writeDebugLogs()
        .build();//开始构建
        ImageLoader.getInstance().init(config);//全局初始化此配置  
    }
    public static void loadImage(String urlString , ImageView imageView , int defaultRes){
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .showImageOnLoading(defaultRes) //设置图片在下载期间显示的图片  
        .showImageForEmptyUri(defaultRes)//设置图片Uri为空或是错误的时候显示的图片  
        .showImageOnFail(defaultRes)  //设置图片加载/解码过程中错误时候显示的图片
        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
        .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
        .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
        .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
        .bitmapConfig(Config.RGB_565)//设置图片的解码类型//  
        .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
        .build();//构建完成  
        ImageLoader.getInstance().displayImage(urlString, imageView, options);
    }
    /**
     * 加载圆角图片
     * @param urlString
     * @param imageView
     * @param cornerRadius  圆角大小
     * @param defaultRes
     */
    public static void LoadRoundImage(String urlString , ImageView imageView , int cornerRadius , int defaultRes){
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .showImageOnLoading(defaultRes) //设置图片在下载期间显示的图片  
        .showImageForEmptyUri(defaultRes)//设置图片Uri为空或是错误的时候显示的图片  
        .showImageOnFail(defaultRes)  //设置图片加载/解码过程中错误时候显示的图片
        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
        .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
        .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
        .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
        .bitmapConfig(Config.RGB_565)//设置图片的解码类型//  
        .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
        .displayer(new RoundedBitmapDisplayer(cornerRadius))//是否设置为圆角,弧度为多少  
        .build();//构建完成  
        ImageLoader.getInstance().displayImage(urlString, imageView, options);
    }
    /**
     * 加载圆形图片
     * @param urlString
     * @param imageView
     * @param defaultRes
     */
    public static void LoadCircleImage(String urlString , ImageView imageView, int defaultRes){
        Bitmap circleBitmap = BitmapFactory.decodeResource(LokApp.app().getApplicationContext().getResources(), defaultRes);
        CircleImageDrawable circleImageDrawable = new CircleImageDrawable(circleBitmap);
        
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .showImageOnLoading(circleImageDrawable) //设置图片在下载期间显示的图片  
        .showImageForEmptyUri(circleImageDrawable)//设置图片Uri为空或是错误的时候显示的图片  
        .showImageOnFail(circleImageDrawable)  //设置图片加载/解码过程中错误时候显示的图片
        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
        .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中  
        .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
        .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
        .bitmapConfig(Config.RGB_565)//设置图片的解码类型//  
        .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
        .displayer(new CircleBitmapDisplayer())
        .build();//构建完成  
        ImageLoader.getInstance().displayImage(urlString, imageView, options);
    }
    /**
     * 获取手机上所有图片的地址
     * @param context
     * @return
     */
    public static List<String> getAllImageFlilPath(Activity context){
        List<String> paths = new ArrayList<String>();
        ContentResolver cr = context.getContentResolver();
        Cursor cursor = null;
        try{
            cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
            while(cursor.moveToNext()){
                String imgPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
                if (!TextUtils.isEmpty(imgPath)){
                    paths.add(imgPath);
                }
            }
        }catch(Exception e){
            M95Log.e("Exception", "getAllImageFlilPath" + e.getMessage());
            e.printStackTrace();
        }finally{
            if(cursor != null) cursor.close();
        }
        return paths;
    }
}

附件列表

Universal-Image-Loader 示例 工具的更多相关文章

  1. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  2. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  3. universal image loader自己使用的一些感受

    1.全局入口的Application定义初始化: ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Build ...

  4. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解

    在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...

  5. Android中Universal Image Loader开源框架的简单使用

    UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...

  6. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

  7. 开源项目Universal Image Loader for Android 说明文档 (1) 简介

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  8. 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  9. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

随机推荐

  1. 查看SQL server服务名

    net start MSSQL$SQLEXPRESS 启动服务命令 net stop MSSQL$SQLEXPRESS 关闭服务命令 网上看到的那些 我都用不了 最后想起了这个 现在好了

  2. JavaScript Arguments 实现可变参数的函数,以及函数的递归调用

    //可变参数的函数 注:也可以使用对象作为参数来实现 function Max() { var temp = arguments[0] || 0; for (var i = 1; i < arg ...

  3. php视图操作

    一.视图的基本介绍          视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询.         使用视图需要MySQL5及以后的版本支持.         下面是视图 ...

  4. zepto源码研究 - zepto.js - 5(dom属性管理)

    index: $.fn = {...... indexOf: emptyArray.indexOf,} index: function(element){ //这里的$(element)[0]是为了将 ...

  5. jquery 20行代码实现简单轮播效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. js和jquery中有关透明度操作的问题

    在日常开发的网站中,常常会用到设置透明度问题,最简单的就是图片的淡入淡出效果.下面我介绍一下在原生js和jQuery中设置透明度的相关问题和注意点: 1 透明度样式设置       透明度在IE浏览器 ...

  7. jquery keypress事件浏览器兼容性

    今天在做“财务管理系统”的时候,使用jquery的ajax从前台传递用户输入到后台,并保存到数据库,但是在前台为了界面的简介和一致性,没有使用按 钮来实现"确定"和"取消 ...

  8. JS中typeof与instanceof的区别 (2010-05-26 10:47:40

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前 ...

  9. python_基本语法_01

    离毕业工作还有几个月,本来想早点去公司实习,无奈gb学校不给放.好吧,既然这样,就学门语言. 参考与 http://www.cnblogs.com/vamei ,我是跟着这位博客牛人的博客教程学的,具 ...

  10. MYSQL正式环境主从复制(不锁表,不停服务)

    参考URL: http://rfyiamcool.blog.51cto.com/1030776/1016636/ 原因源于其实以前环境是有MYSQL主从复制的,且最开始主从复制之间是OK的. 但由于日 ...