ImageLoader和Photoview

本文详细介绍ImageLoader库的使用方法及配置技巧,包括初始化、图片加载、缓存管理等,并提供了实用代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

final PhotoViewAttacher attacher = new PhotoViewAttacher(imageView);//photoview使用方法:

    ImageLoader.getInstance().displayImage(Url.IMAGE_PREFIX+urlList.get(position), imageView, ImageLoaderOptions.pager_options,//ImageLoader.getInstance().displayImage使用方法
            new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                }
                @Override
                public void onLoadingFailed(String imageUri, View view,
                        FailReason failReason) {
                }
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    attacher.update();
                    //在加载完图片的时候更新一下attacher
                }
                @Override
                public void onLoadingCancelled(String imageUri, View view) {
                }
            });



            viewpager显示图片:
            注意:如果是给viewpager放大图片:viewpager切换图片:photoview里也能滑动切换:但是
            当imageview不存在的时候  photoview内部会判断:如果imageview==null  抛出异常:可是在viewpager中就缓存三个其他的销毁:一销毁为null就报异常:
            将报异常注释掉

imageloader的使用:要参照例子:列库下载的时候的例子
一:要在全局的application中初始化:
二:调用:参数:参数一般单独建一个类

public class GooglePlayApplication extends Application{
private static Context context;
private static Handler mainHandler;//主线程的handler
/**
* app的入口函数
*/
@Override
public void onCreate() {
super.onCreate();

    initImageLoader(this);
}

public static void initImageLoader(Context context) {
    // This configuration tuning is custom. You can tune every option, you may tune some of them,
    // or you can create default configuration by

// ImageLoaderConfiguration.createDefault(this);
// method.
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
config.threadPriority(Thread.NORM_PRIORITY - 2);//配置下载图片的线程优先级
config.denyCacheImageMultipleSizesInMemory();//不会在内存中缓存多个大小的图片
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());//为了保证图片名称唯一
config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
//内存缓存大小默认是:app可用内存的1/8
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // Remove for release app

    // Initialize ImageLoader with configuration.
    ImageLoader.getInstance().init(config.build());

// ImageLoader.getInstance().init( ImageLoaderConfiguration.createDefault(this));
}

package com.itheima71.googleplay.global;

import android.graphics.Bitmap;

import com.itheima71.googleplay.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

public class ImageLoaderOptions {
//在显示小图的选项
public static DisplayImageOptions list_options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_default)// 加载过程中显示什么图片
.showImageForEmptyUri(R.drawable.ic_default)// url为空的时候显示什么图片
.showImageOnFail(R.drawable.ic_default)// 加载失败显示什么图片
.cacheInMemory(true)// 在内存缓存
.cacheOnDisk(true)// 在硬盘缓存
.considerExifParams(true)// 会识别图片的方向信息
.displayer(new FadeInBitmapDisplayer(500)).build();// 渐渐显示的动画
// .displayer(new RoundedBitmapDisplayer(100)).build();//显示圆角或圆形图片

//在显示大图的时候的选项,
public static DisplayImageOptions pager_options = new DisplayImageOptions.Builder()
        .showImageForEmptyUri(R.drawable.ic_default)
        .showImageOnFail(R.drawable.ic_default)
        .resetViewBeforeLoading(true)//在ImageView显示图片之前先清空已有的图片内容
        .cacheOnDisk(true)
        .imageScaleType(ImageScaleType.EXACTLY)//会进一步将按照ImageView的宽高来缩放
        .bitmapConfig(Bitmap.Config.RGB_565)//设置颜色的渲染模式,是比较节省内存的模式
        .considerExifParams(true)
        .displayer(new FadeInBitmapDisplayer(300)).build();

}

.bitmapConfig(Bitmap.Config.RGB_565)//设置为RGB565比起默认的ARGB_8888要节省大量的内存
.delayBeforeLoading(100)//载入图片前稍做延时可以提高整体滑动的流畅度

listview 跳图的问题:
在加载前给显示图片的控件设置一个tag,例:
holder.ivIcon.setTag(url);

在加载完成的时候:

if(imageUri.equals(holder.ivIcon.getTag())){
holder.ivIcon.setImageBitmap(loadedImage);
}

另外最好用ImageLoader.getInstance().loadImage这个方法加载图片

真正的闪烁原因不是display和imageload方法的缘故,而是在设置option时,设置了,displayer(new FadeInBitmapDisplayer(200))的缘故,
直接设置为.displayer(new SimpleBitmapDisplayer()),然后再getview方法中调用display方法,就不会闪烁了.

首先给ImageView设置一个Tag,这个Tag中设置的是图片的url,
然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了。

colors=new int[]{context.getResources().getColor(R.color.imagebackgroud_one),
context.getResources().getColor(R.color.imagebackgroud_two),
context.getResources().getColor(R.color.imagebackgroud_three),
context.getResources().getColor(R.color.imagebackgroud_four)
};

冉冉给的 option参数不能太多>>>>>>>
defaultOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.iamge_backgroud_loading_defult)
.showImageForEmptyUri(R.drawable.iamge_backgroud_loading_defult)
.showImageOnFail(R.drawable.iamge_backgroud_loading_defult).cacheInMemory(true)
.cacheOnDisk(true).considerExifParams(true).build();

剪图:不传option 然后就没有问题:图片不会被放大,不传option 使用的默认的 去比对:将默认的图片去掉:就没有问题!
defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true).considerExifParams(true).build();

//imageloader清缓存
ImageLoader.getInstance().clearMemoryCache();

imageloader使用的最实际方法:

//功能性试验
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.threadPriority(Thread.NORM_PRIORITY - 2)//配置下载图片的线程优先级
.denyCacheImageMultipleSizesInMemory()//不会在内存中缓存多个大小的图片
.diskCacheFileNameGenerator(new Md5FileNameGenerator())//为了保证图片名称唯一
.diskCacheSize(50 * 1024 * 1024) // 50 MiB
//内存缓存大小默认是:app可用内存的1/8
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs()// Remove for release app
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);

    各种情况的显示



    public static DisplayImageOptions options= new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.img_down)
        .showImageForEmptyUri(R.drawable.img_down)
        .showImageOnFail(R.drawable.img_down).cacheInMemory(true)
        .cacheOnDisk(true).considerExifParams(true)
        .displayer(new FadeInBitmapDisplayer(1000))//是否图片加载好后渐入的动画时间
        .build();
public static DisplayImageOptions headOptions=new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.head_loading)
        .showImageForEmptyUri(R.drawable.head_loading)
        .showImageOnFail(R.drawable.head_loading).cacheInMemory(true)
        .cacheOnDisk(true).considerExifParams(true)
        .displayer(new FadeInBitmapDisplayer(1000))//是否图片加载好后渐入的动画时间
        .build();
public static DisplayImageOptions playOption=new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.img_default)
        .showImageForEmptyUri(R.drawable.img_default)
        .showImageOnFail(R.drawable.img_default).cacheInMemory(true)
        .cacheOnDisk(true).considerExifParams(true)
        .displayer(new SimpleBitmapDisplayer())//是否图片加载好后渐入的动画时间
        .build();
public static DisplayImageOptions optionsCrop= new DisplayImageOptions.Builder()
        .cacheInMemory(true)
        .cacheOnDisk(true).considerExifParams(true).build();
    public  static DisplayImageOptions playRoundOption=new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.img_default)
            .showImageForEmptyUri(R.drawable.img_default)
            .showImageOnFail(R.drawable.img_default).cacheInMemory(true)
            .cacheOnDisk(true).considerExifParams(true)
            .displayer(new RoundedBitmapDisplayer(5))//是否图片加载好后渐入的动画时间
            .build();





    网站:http://www.2cto.com/kf/201412/361295.html

File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
.diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
.taskExecutor(…)
.taskExecutorForCachedImages(…)
.threadPoolSize(3) // default 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 打印debug log
.build(); //开始构建

    DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片
    .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片
    .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片
    .resetViewBeforeLoading(false)  // default 设置图片在加载前是否重置、复位
    .delayBeforeLoading(1000)  // 下载前的延迟时间
    .cacheInMemory(false) // default  设置下载的图片是否缓存在内存中
    .cacheOnDisk(false) // default  设置下载的图片是否缓存在SD卡中
    .preProcessor(...)
    .postProcessor(...)
    .extraForDownloader(...)
    .considerExifParams(false) // default
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
    .bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型
    .decodingOptions(...)  // 图片的解码设置
    .displayer(new SimpleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)
    .handler(new Handler()) // default
    .build();

1).imageScaleType(ImageScaleType imageScaleType) //设置图片的缩放方式
缩放类型mageScaleType:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2).displayer(BitmapDisplayer displayer) //设置图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片

    .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)

.displayer(new FadeInBitmapDisplayer(100))// 图片加载好后渐入的动画时间

1、 ImageLoader.getInstance().displayImage(uri, imageView);
2、 ImageLoader.getInstance().displayImage(uri, imageView, options);
3、 ImageLoader.getInstance().displayImage(uri, imageView, listener);
4、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener);
5、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener, progressListener);

imageUrl 图片的URL地址
imageView 显示图片的ImageView控件
options DisplayImageOptions配置信息
listener 图片下载情况的监听
progressListener 图片下载进度的监听

ImageLoader.getInstance().displayImage(uri, imageView, options,
new ImageLoadingListener() {

        @Override
        public void onLoadingStarted(String arg0, View arg1) {
            //开始加载
        }

        @Override
        public void onLoadingFailed(String arg0, View arg1,
                FailReason arg2) {
            //加载失败
        }

        @Override
        public void onLoadingComplete(String arg0, View arg1,
                Bitmap arg2) {
            //加载成功
        }

        @Override
        public void onLoadingCancelled(String arg0, View arg1) {
            //加载取消
        }
    }, new ImageLoadingProgressListener() {

        @Override
        public void onProgressUpdate(String imageUri, View view,
                int current, int total) {
            //加载进度
        }
    });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值