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. angularjs不同页面间controller传参方式,使用service封装sessionStorage

    这里分享一个我在实际项目中,使用service封装的一个依赖sessionStorage的传参服务. 这里先说下大背景,在我们的实际开发中,登陆之后一般会存在一个token,这个token将会贯穿全场 ...

  2. Mysql 锁粒度

    表锁: 表锁是mysql 中最几本的锁策略,并且是开销最小的策略:它会锁定整张表. 一个用户在对表进行锁操作(增,删,改)前,首先要获得写锁,这会阻塞其他用户对该表的所有读写操作.只有没有写锁时,其他 ...

  3. Oracle数据库之序列

    Oracle数据库之序列(sequence) 序列是一个计数器,它并不会与特定的表关联.我们可以通过创建Oracle序列和触发器实现表的主键自增.序列的用途一般用来填充主键和计数. 一.创建序列 语法 ...

  4. 使用微软 AppFabric 遇到问题

    我做的一个项目用了,但是遇到很奇怪的问题,在测试环境下,两台机做集群,一切正常,达到设计要求,但是部署到专用网络(内部网络,无法访问internet),老是提示访问服务器超时,初步排查,发现貌似是域的 ...

  5. MVC模式下xml文件的解析

    第一次写blog,组织不当和出错的地方还请大家多担当哈. java操作xml文件的方式中用的较多的有四种,DOM.SAX.JDOM.DOM4J.除第一种外其余的三种我都有试过,这后三种方案中我选择用S ...

  6. linux中top命令详解

    linux的top命令里的cpu信息是什么意思呢? Cpu(s): 62.1% us, 15.9% sy,0.1% ni, 19.4% id,2.0% wa,0.1% hi,0.4% si Mem:  ...

  7. jquery与discuz冲去的解决方法

    把相应的JQUERY代码天下如下代码: <script type="text/javascript"> jQuery.noConflict(); </script ...

  8. vsftpd 访问 权限控制

    vsftpd 重启命令 service vsftpd  start|restart|stop vsftpd 关于权限控制,有两个文件分别设置,都会起作用 /etc/vsftpd/user_list / ...

  9. string string.h=cstring=str

    <string.h> <string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <cstring> 在C++标准化(1998年 ...

  10. 简单DOS命令实现局域网Windows远程关机

    1秒内重启局域网内计算机名为ppgsvr-pc的用户电脑shutdown -r -m \\ComputerName -t 1 1秒内关闭局域网内ppgsvr用户电脑shutdown -s -m \\C ...