博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Universal-Image-Loader 示例 工具
阅读量:6940 次
发布时间:2019-06-27

本文共 14502 字,大约阅读时间需要 48 分钟。

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(imageLoaderpauseOnScrollpauseOnFling));
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(STATE_PAUSE_ON_SCROLLpauseOnScroll);
        outState.putBoolean(STATE_PAUSE_ON_FLINGpauseOnFling);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLLfalse);
        pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLINGtrue);
    }
    @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(imageLoaderpauseOnScrollpauseOnFling));
            return true;
        case R.id.item_pause_on_fling:
            pauseOnFling = !pauseOnFling;
            item.setChecked(pauseOnFling);
            listView.setOnScrollListener(new PauseOnScrollListener(imageLoaderpauseOnScrollpauseOnFling));
            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.IMAGESimageUrls);
                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.imageoptionsloadingListener);
            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_POSITIONpager.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, optionsnew 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_URInullnullnull, 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;
    }
}

附件列表

 

转载地址:http://uifnl.baihongyu.com/

你可能感兴趣的文章
(转)SplitContainer 控件(Windows 窗体)
查看>>
【转】PHP foreach 小结
查看>>
【转】如何用Redis做LRU-Cache
查看>>
项目—视频直播系统
查看>>
java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
查看>>
HttpClient使用详解
查看>>
java中对JVM的深度解析、调优工具、垃圾回收
查看>>
浅谈Java语言中ArrayList和HashSet的区别
查看>>
React文档(十四)深入JSX
查看>>
Spring集成线程池
查看>>
winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
查看>>
Python基础 2
查看>>
java 内存溢出-与gc
查看>>
python django开发问题
查看>>
51nod1238 最小公倍数之和 V3
查看>>
扩展欧几里得 POJ 1061
查看>>
iOS开发之UIDevice通知
查看>>
与其倒推以前不如推到重建
查看>>
Could not find Developer Disk Image
查看>>
表空间和文件系统使用率监控脚本
查看>>