介绍一下Android图片加载的4种框架的基本使用方法
定义了Constants类来存储一些图片网址
之后就一步一步来就可以了(注释很详细~~~)
一,Glide:
public class GlideActivity extends AppCompatActivity { private ListView listView; private String[] imageUrl; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); listView = (ListView) findViewById(R.id.listview_my); imageUrl = Constants.imagesGif; listView.setAdapter(new GlideAdapter()); } class GlideAdapter extends BaseAdapter { @Override public int getCount() { return imageUrl.length; } @Override public Object getItem(int position) { return imageUrl[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.list_item_gif, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } initGlide(holder,position); return convertView; } class ViewHolder { private ImageView imageView; public ViewHolder(View view) { super(); imageView = (ImageView) view.findViewById(R.id.iv_gif); } } } public void initGlide(GlideAdapter.ViewHolder holder, int pos) { //这也是最基本的写法 // Glide.with(this).load(imageUrl[pos]).into(holder.imageView); ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() { @Override public void animate(View view) { view.setAlpha( 0f ); ObjectAnimator fadeAnim = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f ); fadeAnim.setDuration( 2500 ); fadeAnim.start(); } }; // Glide.with(this).load(imageUrl[pos]) .placeholder(R.mipmap.ic_launcher) .error(R.mipmap.ic_launcher) .animate(animationObject) //渐变动画 // .dontAnimate()//移除动画 //.skipMemoryCache(true) //禁止内存缓存 //.diskCacheStrategy(DiskCacheStrategy.NONE) //禁止磁盘缓存 //DiskCacheStrategy.SOURCE:缓存原始数据, // DiskCacheStrategy.RESULT:缓存变换(如缩放、裁剪等)后的资源数据, // DiskCacheStrategy.NONE:什么都不缓存, // DiskCacheStrategy.ALL:缓存SOURC和RESULT。 // 默认采用DiskCacheStrategy.RESULT策略, // 对于download only操作要使用DiskCacheStrategy.SOURCE。 .priority(Priority.HIGH) //优先加载 //指定加载的优先级,优先级越高越优先加载,但不保证所有图片都按序加载 //Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默认为Priority.NORMAL。 .thumbnail(0.5f) //利用原图的一半作为缩略图 //请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,就显示缩略图,否则就不显示。 // 系数sizeMultiplier必须在(0,1)之间,可以递归调用该方法。 //.override(100,100)//重新设置宽高 单为 px //先添加依赖 compile 'jp.wasabeef:glide-transformations:2.0.0' .bitmapTransform(new CropCircleTransformation(this))//圆形处理 // .bitmapTransform(new RoundedCornersTransformation // (this,30,0, RoundedCornersTransformation.CornerType.ALL))//圆角处理 .into(holder.imageView); } }
二,Picasso:
public class PicassoActivity extends AppCompatActivity { private ListView listView; private String[] imageUrl; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); listView = (ListView) findViewById(R.id.listview_my); imageUrl = Constants.images; listView.setAdapter(new PicassoAdapter()); } class PicassoAdapter extends BaseAdapter { @Override public int getCount() { return imageUrl.length; } @Override public Object getItem(int position) { return imageUrl[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } initPicasso(holder,position); return convertView; } class ViewHolder { private ImageView imageView; public ViewHolder(View view) { super(); imageView = (ImageView) view.findViewById(R.id.iv_item); } } } public void initPicasso(PicassoAdapter.ViewHolder holder, int pos) { //最最基本的写法 //Picasso.with(this).load(imageUrl[pos]).into(holder.imageView); Picasso.with(this).load(imageUrl[pos]) .placeholder(R.mipmap.ic_launcher)//加载时的图片 .error(R.mipmap.ic_launcher) //失败时的图片 // .resize(50, 50).centerCrop()//剪裁图片 .transform(new CircleTransform())//自定义转换圆形图片 // .memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)//不使用内存缓存 // .networkPolicy(NetworkPolicy.NO_CACHE,NetworkPolicy.NO_STORE)//不使用磁盘缓存 .into(holder.imageView); } public class CircleTransform implements Transformation { @Override public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squaredBitmap != source) { source.recycle(); } Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); paint.setShader(shader); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); squaredBitmap.recycle(); return bitmap; } @Override public String key() { return "circle"; } } }三,Fresco:
public class FrescoActivity extends AppCompatActivity { private String[] imageUrl; private ListView listView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this);//一定要在setContentView之前写 setContentView(R.layout.activity_list); listView = (ListView) findViewById(R.id.listview_my); imageUrl = Constants.images; listView.setAdapter(new FrescoAdapter()); } class FrescoAdapter extends BaseAdapter { @Override public int getCount() { return imageUrl.length; } @Override public Object getItem(int position) { return imageUrl[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.list_item_fresco, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Uri uri = Uri.parse(imageUrl[position]); initDraweeView(holder.simpleDraweeView, uri); return convertView; } class ViewHolder { private SimpleDraweeView simpleDraweeView; public ViewHolder(View view) { super(); simpleDraweeView = (SimpleDraweeView) view.findViewById(R.id.draw); } } } public void initDraweeView(SimpleDraweeView simpleDraweeView, Uri uri) { DraweeController draweeController = Fresco.newDraweeControllerBuilder() .setUri(uri) .setAutoPlayAnimations(true) .build(); simpleDraweeView.setController(draweeController); } }
四,Android Universal Image Loader:
part1:
public class UILApp extends Application { @Override public void onCreate() { super.onCreate(); initMyImageLoader(this); } /** * 4这个方法是对ImageLoaderConfiguration各属性解释 * 切记不要瞎用 */ public static void initImageLoader(Context context) { //这里的路径可以自定义 File cacheDir = StorageUtils.getCacheDirectory(context); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) // 默认等于你的屏幕尺寸,设备屏幕宽高 .memoryCacheExtraOptions(480, 800) // 在将下载的图片保存到你的sd卡之前会重新计算,压缩。 // 这个属性不要滥用,只有你在对应的需求时再用,因为他会使你的ImageLoader变的很慢。 .diskCacheExtraOptions(480, 800, null) //用于执行从源获取图片任务的 Executor,为configuration中的 taskExecutor, // 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。 .taskExecutor(null) //用于执行从缓存获取图片任务的 Executor,为configuration中的 taskExecutorForCachedImages, // 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。 .taskExecutorForCachedImages(null) // 表示核心池大小(最大并发数) 默认为3 .threadPoolSize(3) // 线程优先级,默认Thread.NORM_PRIORITY - 2 .threadPriority(Thread.NORM_PRIORITY - 2) // 任务进程的顺序,默认为:FIFO 先进先出 .tasksProcessingOrder(QueueProcessingType.FIFO) //设置内存缓存不允许缓存一张图片的多个尺寸,默认允许。 .denyCacheImageMultipleSizesInMemory() //图片内存缓存 .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //memoryCacheSize 为 0,则设置该内存缓存的最大字节数为 App 最大可用内存的 1/8。 .memoryCacheSize(2 * 1024 * 1024) // 创建最大的内存缓存百分比,默认为 13% .memoryCacheSizePercentage(13) // 硬盘缓存路径,默认为StorageUtils.getCacheDirectory(context) .diskCache(new UnlimitedDiskCache(cacheDir)) //硬盘缓存大小 .diskCacheSize(50 * 1024 * 1024) //缓存文件数量 .diskCacheFileCount(100) // 硬盘缓存文件名生成器,默认为哈希文件名生成器 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // 创建图片下载器,默认是BaseImageDownloader .imageDownloader(new BaseImageDownloader(context)) // 图片解码器,负责将图片输入流InputStream转换为Bitmap对象 .imageDecoder(new BaseImageDecoder(true)) // 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。 .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) //是否显示调试log信息 .writeDebugLogs() .build(); ImageLoader.getInstance().init(config); } /** * 这个是推荐的写法 */ public static void initMyImageLoader(Context context) { //缓存文件的目录 File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 .threadPoolSize(3) //线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密 .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) //你可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值 .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值 .tasksProcessingOrder(QueueProcessingType.LIFO) .diskCache(new UnlimitedDiskCache(cacheDir))//自定义缓存路径 .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间 .writeDebugLogs() .build(); //全局初始化此配置 ImageLoader.getInstance().init(config); } }
part2:
public class UILActivity extends AppCompatActivity implements View.OnClickListener { private ListView listView; private String[] imageUrl; private DisplayImageOptions options; private ImageLoader imageLoader; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_uil); imageLoader = ImageLoader.getInstance(); listView = (ListView) findViewById(R.id.listview_uil); findViewById(R.id.btn_clear_disk).setOnClickListener(this); findViewById(R.id.btn_clear_memory).setOnClickListener(this); imageUrl = Constants.images; initMyOptions(); listView.setAdapter(new UILAdapter()); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_clear_disk: imageLoader.clearDiskCache(); Toast.makeText(UILActivity.this, "已清除本地缓存", Toast.LENGTH_SHORT).show(); break; case R.id.btn_clear_memory: imageLoader.clearMemoryCache(); Toast.makeText(UILActivity.this, "已清除内存缓存", Toast.LENGTH_SHORT).show(); break; } } class UILAdapter extends BaseAdapter { @Override public int getCount() { return imageUrl.length; } @Override public Object getItem(int position) { return imageUrl[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } imageLoader.displayImage(imageUrl[position], holder.imageView, options); return convertView; } class ViewHolder { private ImageView imageView; public ViewHolder(View view) { super(); imageView = (ImageView) view.findViewById(R.id.iv_item); } } } /** * 这里是对options所有属性的解释 */ public void initOptions() { options = new DisplayImageOptions.Builder() // 正在加载时显示的占位图 .showImageOnLoading(R.mipmap.ic_launcher) // URL为空时显示的占位图 .showImageForEmptyUri(R.mipmap.ic_launcher) // 加载失败时显示的占位图 .showImageOnFail(R.mipmap.ic_launcher) // 在加载前是否重置 view,默认为false .resetViewBeforeLoading(false) //设置在开始加载前的延迟时间,单位为毫秒,通过 Builder 构建的对象默认为 0 .delayBeforeLoading(1000) // 是否缓存在内存中,通过 Builder 构建的对象默认为 false .cacheInMemory(false) // 是否缓存在磁盘中,通过 Builder 构建的对象默认为 false。 .cacheOnDisk(false) //缓存在内存之前的处理程序,默认为 null .preProcessor(null) //缓存在内存之后的处理程序,默认为 null。 .postProcessor(null) //下载器需要的辅助信息。下载时传入ImageDownloader.getStream(String, Object)的对象,方便用户自己扩展,默认为 null。 .extraForDownloader(null) // 是否考虑图片的 EXIF 信息,通过 Builder 构建的对象默认为 false。 .considerExifParams(false) // 图片的缩放类型,通过 Builder 构建的对象默认为IN_SAMPLE_POWER_OF_2 .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // bitmap的质量,默认为ARGB_8888 .bitmapConfig(Bitmap.Config.ARGB_8888) //为 BitmapFactory.Options,用于BitmapFactory.decodeStream(imageStream, null, decodingOptions)得到图片尺寸等信息。 .decodingOptions(null) // 在ImageAware中显示 bitmap 对象的接口。可在实现中对 bitmap 做一些额外处理,比如加圆角、动画效果。 .displayer(new SimpleBitmapDisplayer()) // handler 对象,默认为 null .handler(new Handler()) .build(); } /** * 这是我要使用的options */ public void initMyOptions() { // 使用DisplayImageOptions.Builder()创建DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .build(); // 构建完成 } }ok,以上就是Android图片加载的几种框架的基本用法~~~
最后感谢硕哥提供的分享代码!!!