zoukankan      html  css  js  c++  java
  • Universal-Image-Loader 示例 工具


    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;
        }
    }





    附件列表

    • 相关阅读:
      智能指针unique_ptr记录
      ubuntu系统火狐无法播放网页视频
      javascript中json对象json数组json字符串互转及取值
      C#压缩文件
      C#异步编程
      C# POST请求 json格式
      C# Http方式下载文件到本地类
      C#中NPOI操作excel之读取和写入excel数据
      浅析C#中抽象类和接口的区别
      C#自动实现Dll(OCX)控件注册的两种方法
    • 原文地址:https://www.cnblogs.com/baiqiantao/p/5509244.html
    Copyright © 2011-2022 走看看