Android进阶之路 - Glide、Picasso的简单使用与自封工具

在当前的Android开发中,我们除去较早前使用的ImageLoader之外,可能用的较多的就是PicassoGlide或是类似fackbook的图片加载工具,我们使用这些框架的主要原因还是使用便捷,深深的被那种一行代码的就实现图片加载的功能所吸引…

建议直接跳到 Glide - 项目实战 !基本可满足业务需求了 ~

此篇包含了Picasso、Glide这俩种框架的简单使用与自封工具,需要使用的话,直接copy出Util就可以使用了,主讲Glide、辅讲Picasso ~

俩者区别

  • Glide比Picasso加载速度快,但Glide比Picasso需要更大的空间来缓存;

  • Glide加载图像及磁盘缓存的方式都优于Picasso,且Glide更有利于减少OutOfMemoryError的发生;

  • Glide可以加载Gif动图,Picasso不可以加载动图

  • Picasso加载的图片比Glide加载的图片平滑(可忽略不计)

Picasso
基础配置

简单讲一下使用方式,未深入~

AndroidManifest(添加权限)

   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加依赖

	compile 'com.squareup.picasso:picasso:2.5.2' 

加载方式

//context:上下文 loadurl:需要加载的图片地址 imageView:图片的承载控件
Picasso.with(context).load(loadUrl).into(imageView);
使用场景

MainActivity

package com.example.picassodemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

public class MainActivity extends AppCompatActivity {

    private TextView mTv;
    private ImageView mIv;
    private TextView mTv2;
    private ImageView mIV2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }
    private void initView() {
        mTv = (TextView) findViewById(R.id.tv_btn1);
        mIv = (ImageView) findViewById(R.id.iv_one);
        mTv2 = (TextView) findViewById(R.id.tv_btn2);
        mIV2 = (ImageView) findViewById(R.id.iv_two);
    }

    private void initEvent() {
       final String url="http://cdn.duitang.com/uploads/item/201604/27/20160427004300_QfKwt.jpeg";
        mTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Picasso.with(getApplicationContext()).load(url).into(mIv);
            }
        });

        mTv2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PicassoUtil.picassoPrimary(getApplication(),url,mIV2);
            }
        });
    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="com.example.picassodemo.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:id="@+id/tv_btn1"
        android:text="加载" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/iv_one"
        android:layout_weight="1"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:id="@+id/tv_btn2"
        android:text="加载" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/iv_two"
        android:layout_weight="1"
        />
</LinearLayout>
自封工具

自封的Util,可直接拿到项目中使用(PicassoUtil)

PicassoUtil

package com.example.picassodemo;

import android.content.Context;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import java.io.File;

public class PicassoUtil {

    //基础使用 - 网络加载
    public static void picassoPrimary(Context context, String loadUrl, ImageView imageView) {
        Picasso.with(context).load(loadUrl).into(imageView);
    }
    //显错使用 - 网络加载
    public static void picassoIntermediate(Context context, String loadUrl, int errorImageView, ImageView imageView) {
        Picasso.with(context).load(loadUrl).error(errorImageView).into(imageView);
    }
    
    //占位使用 - 网络加载 - 推荐
    public static void picassoAdvanced(Context context, String loadUrl, int placeImageView, int errorImageView, ImageView imageView) {
        Picasso.with(context).load(loadUrl).placeholder(placeImageView).error(errorImageView).into(imageView);
    }
    
    //限制使用(可设置图片大小,圆角) - 网络加载
    public static void picassoClip(Context context, String loadUrl, int width, int height, ImageView imageView) {
        Picasso.with(context).load(loadUrl).resize(width, height).centerCrop().into(imageView);
    }
    
    //资源加载
    public static void picassoResource(Context context, int resource, ImageView imageView) {
        Picasso.with(context).load(resource).into(imageView);
    }
    
    //本地加载
    public static void picassoFile(Context context, String file, ImageView imageView) {
        Picasso.with(context).load(new File(file)).into(imageView);
    }
    //Adapter取消已经在视野之外的ImageView- 此封装可能有误,建议不要使用此方法
    public static void picassoCancel(Context context, String url,ImageView imageView){
        /**
         * 在Adapter的getView中执行String url = getItem(position)
         * 之后获取url输入到第二个参数就可以
         * */
        Picasso.with(context).load(url).into(imageView);
    }
}

Glide
基础配置

AndroidManifest清单文件 - 添加权限

   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

build.gradle添加依赖(如不使用butterknife,可不添加):

    compile 'com.jakewharton:butterknife:6.1.0'
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:24.0.0'

加载方式

//context:上下文 loadurl:需要加载的图片地址 imageView:图片的承载控件
Glide.with(context).load(loadUrl).into(imageView);

常用API - 使用方式:RequestOptions options = new RequestOptions() .对应API

功能API
加载中占位图.placeholder
加载失败占位图.error
制定图片大小.override(wigth, height)
默认为false,及自动缓存,如设置为true则是不缓存.skipMemoryCache(true)
硬盘缓存.diskCacheStrategy()
静态图(可不指定,框架自动区分).asBitmap()
gif图(可不指定,框架自动区分).asGif()

.diskCacheStrategy() 硬盘缓存有以下几个参数

  • DiskCacheStrategy.NONE: 表示不缓存任何内容
  • DiskCacheStrategy.DATA: 表示只缓存原始图片
  • DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片
  • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片
  • DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)

Glide加载图片可以进行一些变换的操作;比如圆角,模糊等…

添加图片变换的用法非常简单,我们只需要在RequestOptions中串接transforms()方法,并将想要执行的图片变换操作作为参数传入transforms()方法即可

RequestOptions options = new RequestOptions() 
        .transforms(...); 
        
Glide.with(this) 
     .load(url) 
     .apply(options) 
     .into(imageView);
基本使用
  • MainActivity
package com.example.glide;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {
    @InjectView(R.id.iv)
    ImageView mIv;
    @InjectView(R.id.tv)
    TextView mTv;
    @InjectView(R.id.tv_2)
    TextView mTv2;
    @InjectView(R.id.iv_2)
    ImageView mIv2;

    String url_one = "http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png";
    String url_two = "http://hsp-static-file.oss-cn-shanghai.aliyuncs.com/app/icon/thirdparty/guessing_competition.png";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
    }

    @OnClick({R.id.tv, R.id.tv_2})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.tv:
                Glide.with(getApplicationContext()).load(url_one).into(mIv);
                Toast.makeText(getApplication(), "普通触发", Toast.LENGTH_LONG).show();
                break;
            case R.id.tv_2:
                GlideUtil.glideAdvanced(getApplicationContext(), url_two, R.drawable.camera_icon , R.drawable.close_icon, mIv2);
                Toast.makeText(getApplication(), "工具触发", Toast.LENGTH_LONG).show();
                break;
        }
    }
}
  • activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.glide.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv"
        android:padding="5dp"
        android:gravity="center"
        android:text="Glide" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/iv"
        android:layout_weight="1"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_2"
        android:padding="5dp"
        android:gravity="center"
        android:text="GlideUtil" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/iv_2"
        android:layout_weight="1"
        />
</LinearLayout>
自封工具
GlideUtil (初级版 - 2017年使用)
package com.example.glide;

import android.content.Context;
import android.net.Uri;
import android.widget.ImageView;

import com.bumptech.glide.DrawableTypeRequest;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;

import java.io.File;


public class GlideUtil {
    /*适合自己的才是最好的*/

    //基础使用 - 网络加载 - 推荐
    public static void glidePrimary(Context context,String loadUrl, ImageView imageView){
        Glide.with(context).load(loadUrl).into(imageView);
    }
    
    //显错使用 - 网络加载 - 推荐
    public static void glideIntermediate(Context context, String loadUrl, int errorImageView, ImageView imageView) {
        Glide.with(context).load(loadUrl).error(errorImageView).into(imageView);
    }
    
    //占位使用 - 加载中显示的占位图 - 推荐
    public static void  glide(Context context, String loadUrl, int placeImageView, ImageView imageView) {
        Glide.with(context).load(loadUrl).placeholder(placeImageView).into(imageView);
    }
    
    //占位使用 - 加载中显示的占位图 - 加载失败显示的占位图 网络加载 - 推荐
    public static void glideAdvanced(Context context, String loadUrl, int placeImageView, int errorImageView, ImageView imageView) {
        Glide.with(context).load(loadUrl).placeholder(placeImageView).error(errorImageView).into(imageView);
    }
    
    //限制使用(如图片本身较小,依旧会吧ImageView的width,height拉伸) - 网络加载
    public static void glideCrop(Context context, String loadUrl, ImageView imageView) {
        Glide.with(context).load(loadUrl).centerCrop().into(imageView);
    }
    
    //限制使用(图片缩放,ImageView显示小于等于ImageView大小,但是不会填充满当前的ImageView) - 网络加载
    public static void glideFit(Context context, String loadUrl, ImageView imageView) {
        Glide.with(context).load(loadUrl).fitCenter().into(imageView);
    }
    //限制使用(glideCrop-glideFit)俩者测试-以后者的方法为主要显示处理 - 网络加载
    public static void glideCrop_Fit(Context context, String loadUrl, ImageView imageView) {
        Glide.with(context).load(loadUrl).fitCenter().centerCrop().into(imageView);
    }
    
    //资源加载
    public static void glideResource(Context context, int resource, ImageView imageView) {
        Glide.with(context).load(resource).into(imageView);
    }
    
    //本地加载 - 可显示图片
    public static void glideFile(Context context, String file, ImageView imageView) {
        Glide.with(context).load(new File(file)).into(imageView);
    }
    
    //本地加载 - 可显示视频
    public static void glideVideo(Context context, String path, ImageView imageView) {
        Glide.with(context).load(Uri.fromFile(new File(path))).into(imageView);
    }
    
    //显示Gif动画
    public static void glideIsGif(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).asGif().into(imageView);
    }
    
    //跳过内存缓存
    public static void glideSkipCache(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).skipMemoryCache(true).into(imageView);
    }

    //跳过磁盘缓存
    public static void glideDiskCache(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);
    }
    /**
         DiskCacheStrategy.NONE 什么都不缓存
         DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
         DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
         DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)
     * */
    //跳过缓存
    public static void glideDiskCachex(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);
        Glide.with(context).load(loadUrl).skipMemoryCache(true).into(imageView);
    }
    
    //清除内存缓存
    public static void glideClear(Context context){
        Glide.get(context).clearMemory();
    }
    
    //优先加载
    public static void glidePriority_high(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).priority(Priority.priority.HIGH).into(imageView);
    }
    
    //优后加载
    public static void glidePriority_low(Context context,String loadUrl,ImageView imageView){
        Glide.with(context).load(loadUrl).priority(Priority.priority.LOW).into(imageView);
    }
    
    //用原图的比例作为缩略图 - 如无法使用请在比例之后后缀 - f
    public static void glideBreviary(Context context,String loadUrl,float ratio,ImageView imageView){
        Glide.with(context).load(loadUrl).thumbnail(ratio).into(imageView);
    }

    //用其他图片做位缩略图
    public static void glideBreviary_others(Context context,int resource,String loadUrl,float ratio,ImageView imageView) {
        DrawableTypeRequest<Integer> covering = Glide.with(context).load(resource);
        Glide.with(context).load(loadUrl).thumbnail(covering).into(imageView);
    }

    /**
     * 图形处理需要导入相关依赖:
     * compile 'jp.wasabeef:glide-transformations:2.0.0'
     * 库:
     * wasabeef/glide-transformations
     * 建议:
     * 涉及的圆形头像,可以在into的imageview处使用CircleImageVIew
     *
     * 因当前项目并没有导入这个依赖,所以只是进行了封装,如需使用这项功能,自行导入依赖,解开注释即可
     * */
    //图形裁剪
    public  static  void glidePicture_Tailor(Context context,String loadUrl,ImageView imageView){
//        Glide.with(context).load(loadUrl) .bitmapTransform(new CropCircleTransformation(context)).into(imageView);
    }
    
    //圆角处理
    public static void glidePicture_Circular(Context context,String loadUrl,int width,int height,ImageView imageView){
//        Glide.with(context).load(loadUrl).bitmapTransform(new RoundedCornersTransformation(context,width,height,RoundedCornersTransformation.CornerType.ALL)).into(imageView);
    }
    
    //灰度处理
    public static void glidePicture_Color(Context context,String loadUrl,ImageView imageView){
//        Glide.with(context).load(loadUrl).bitmapTransform(new GrayscaleTransformation(context));
    }
}

GlideUtil (中级版 - 2018年使用)
package com.bakheet.garage.utils;

import android.content.Context;
import android.os.Environment;
import android.view.View;
import android.widget.ImageView;

import com.bakheet.garage.R;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions;

import java.io.File;

import jp.wasabeef.glide.transformations.RoundedCornersTransformation;

/**
 * Created  2017/11/09.
 * @describe: 图片加载工具类
 */

public class GlideUtil {
    /**
     * 加载网络图片
     * @param imageUrl 网络图片路径
     * @param imageView 被设置的imageview
     */
    public static void showImage(Context context, String imageUrl, ImageView imageView) {
        if (context != null) {
            RequestOptions options = new RequestOptions().centerCrop().placeholder(R.mipmap.placeholder_brand).error(R.mipmap.placeholder_brand).diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context).load(imageUrl).apply(options).into(imageView);
        }
    }

    /**
     * 加载正常图片,需自定义占位图
     * @param imageUrl 网络图片路径
     * @param imageView 被设置的imageview
     * @param placeholderResId 占位图资源id
     */
    public static void showImage(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
        if (context != null) {
            RequestOptions options = new RequestOptions().centerCrop().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context).load(imageUrl).apply(options).into(imageView);
        }
    }

    public static void showImage(Context context, String imageUrl, View imageView, int placeholderResId) {
        if (context != null) {
            RequestOptions options = new RequestOptions().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
        }
    }

    public static void showImage(Context context, int imageUrl, View imageView, int placeholderResId) {
        if (context != null) {
            RequestOptions options = new RequestOptions().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
        }
    }

    /**
     * 自定义图片缩放方式
     */
    public static void showImage(Context context, String imageUrl, View imageView, int placeholderResId, int radius, RoundedCornersTransformation.CornerType cornerType) {
        if (context != null) {
            RequestOptions options = RequestOptions.bitmapTransform(new RoundedCornersTransformation(radius, 0, cornerType))
                    .placeholder(placeholderResId).error(placeholderResId);
            Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
        }
    }
    /**
     * 加载毛玻璃、高斯模糊效果 图片
     */
   /* public static void showBlur(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
        Glide.with(context).load(imageUrl).bitmapTransform(new BlurTransformation(context, 25)).crossFade().placeholder(placeholderResId).centerCrop().into(imageView);
    }*/

    /**
     * 加载圆图 +毛玻璃图片
     */
    public static void showCircle(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
        if (context != null) {
            Glide.with(context).load(imageUrl).apply(RequestOptions.bitmapTransform(new CircleCrop()).placeholder(placeholderResId)).into(imageView);
        }
    }

    /**
     * 加载毛玻璃、高斯模糊效果 图片
     */
   /* public static void showRound(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
        Glide.with(context).load(imageUrl).bitmapTransform(new RoundedCornersTransformation(context, 30, 0, RoundedCornersTransformation.CornerType.ALL)).crossFade().placeholder(placeholderResId).centerCrop().into(imageView);
    }*/

    /**
     * 加载网络图片
     * @param imageUrl 网络图片路径
     * @param imageView 被设置的imageview
     */
    public static void showImage(Context context, int imageUrl, ImageView imageView) {
        if (context != null) {
            RequestOptions options = new RequestOptions().centerCrop().placeholder(R.mipmap.placeholder_brand).error(R.mipmap.placeholder_brand).diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context).load(imageUrl).apply(options).into(imageView);
        }
    }

    /**
     * Glide加载本地图片
     */
    public static void showFileImage(Context context, String filePath, ImageView imageView) {
        if (context != null) {
            //本地文件
            File file = new File(Environment.getExternalStorageDirectory(), filePath);
            //加载图片
            Glide.with(context).load(file).into(imageView);
        }
    }

    /**
     * Glide图片下载
     */
    public static File downImageFile(Context context, String imageUrl) {
        File file = null;
        try {
            file = Glide.with(context)
                    .load(imageUrl)
                    .downloadOnly(1280, 720)
                    .get();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }
}

Glide - 项目实战

今年再用这个工具的时候,在加载网络图片到本地的时候遇到了一些缓存问题,故此记录一波 ~

对了,为了方便体验效果, 此demo已经上传,如需体验记得要修改内部的图片路径地址 ~

基础配置

AndroidManifest清单文件 - 添加权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />

build.gradle(app)添加依赖

    //这里用的是Android Studio3.0
    implementation 'com.github.bumptech.glide:glide:4.3.1'
    annotationProcessor('com.github.bumptech.glide:compiler:4.3.1')
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'
    implementation 'androidx.appcompat:appcompat:1.0.2'

CustomGlideModule配置类 - 主要设置图片缓存的大小和存储地址

package nk.com.newglidetool;

import android.content.Context;

import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;

/**
 * @author MrLiu
 * @date 2020/8/26
 * desc Glide基础配置
 */
@GlideModule
public class CustomGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        //        设置缓存大小为20mb
        int memoryCacheSizeBytes = 1024 * 1024 * 30; // 30mb
        //        设置内存缓存大小
        builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
        //        根据SD卡是否可用选择是在内部缓存还是SD卡缓存
        if (isSDCardEnable()) {
            builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
        } else {
            builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
        }
    }

    //    针对V4用户可以提升速度
    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

    /**
     * 查看是否存在SD卡
     */
    private boolean isSDCardEnable() {
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            return true;
        } else
            return false;
    }
}
工具封装

GlideUtils - 加载时候区分是否缓存当前图片!这里要注意GlideApp报红,找不到包时编译一下项目即可,也就是AndroidStudio给一锤子就行

package nk.com.newglidetool;

import android.content.Context;
import android.widget.ImageView;

import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;

/**
 * @author MrLiu
 * @date 2020/8/26
 * desc
 */
public class GlideUtils {

    /**
     * 磁盘缓存
     */
    public static void initImageWithFileCache(Context context, String url, ImageView imageView) {
        GlideApp.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .dontAnimate()
                .centerCrop()
                .into(imageView);
    }

    /**
     * Glide跳过内存缓存
     */
    public static void initImageNoCache(Context context, String url, ImageView imageView) {
        GlideApp.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .skipMemoryCache(true)
                .dontAnimate()
                .centerCrop()
                .into(imageView);
    }

    /**
     * 内存缓存清理(主线程)
     */
    public static void clearMemoryCache(Context context) {
        GlideApp.get(context).clearMemory();
    }

    /**
     * 磁盘缓存清理(子线程)
     */
    public static void clearFileCache(final Context context) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                GlideApp.get(context).clearDiskCache();
            }
        }).start();
    }
}
使用方式

MainActivity

package nk.com.newglidetool;

import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		//承载控件
        img = findViewById(R.id.iv_img);
        //图片加载且缓存(如不需要缓存使用另一种方法即可)
        GlideUtils.initImageWithFileCache(MainActivity.this,"这里填入需要加载的网络图片地址即可",img);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //根据业务场景记得清理缓存,一般在MainActivity的onDestroy中进行缓存释放
        GlideUtils.clearFileCache(this);
        GlideUtils.clearMemoryCache(this);
    }
}
Glide优化点
首次加载慢

如图,设置dontAnimate(),从而去除动画效果
在这里插入图片描述

加载图片不全

可逐个尝试,如前几步已满足需求,则无需继续往下观赏 ~

首先查看Glide加载种是否有设置中心裁剪属性 - centerCrop() ,如有则删除;如没有则加入fitCenter(),具体如下
在这里插入图片描述
如上方设置后依旧未解决问题,那么我们需要看一下承载视图的ImageView下ScaleType的设置 ~

提示:layout_width、layout_height自行根据需求进行设置

  • 尝试未设置ScaleType的效果
        <ImageView
            android:id="@+id/iv_banner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
 		/>
  • 尝试设置ScaleType="fitXY"的效果
        <ImageView
            android:id="@+id/iv_banner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
 		/>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值