Android フレームワーク - Glide - 強力な画像読み込みライブラリ

Glide 4 - 強力な画像読み込みライブラリ

**概要:** ローカル画像、ネットワーク画像、Gif、およびビデオをロードできる強力な画像ロード ライブラリです。
Glide 公式 Web サイトのドキュメント: https://muyangmin.github.io/glide-docs-cn/は、変換エフェクト ライブラリ: glide-transformations: https://github.com/wasabeef/glide-transformations
と併用できます。

**利点:**Glide は、ビデオ スナップショット、写真、GIF アニメーションの取得、デコード、表示をサポートしています。Glide の API は非常に柔軟なので、開発者は好きなネットワーク スタックにプラグインして置き換えることもできます。デフォルトでは、Glide はカスタム HttpUrlConnection ベースのスタックを使用しますが、Google Volley および Square OkHttp と迅速に統合するためのツールのライブラリも提供します。

使用:

1. 依存ライブラリを追加する

repositories {
        jcenter()
        mavenCentral()
    }
 implementation 'com.github.bumptech.glide:glide:4.9.0'
 annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
 implementation 'jp.wasabeef:glide-transformations:4.1.0'
権限
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. 一般的な使用方法

String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1566894390240&di=7ed8a09c48bb298d7872a60e80367179&imgtype=0&src=http%3A%2F%2Fimg2.zol.com.cn%2Fproduct%2F103_940x705%2F258%2FceXyT7KxZC9U.jpg";
String gifUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1566894290904&di=3283907b4d74878f5d290d25d6b061f0&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201610%2F10%2F20161010141924_V8vUT.thumb.700_0.gif";

ImageeView imageView = findViewById(R.id.image_view);
LinearLayout linearLayout = findViewById(R.id.linear_layout);
アクティビティまたはフラグメントは Glide.with() に渡されます。これは、Glide が使用されるアクティビティです。

1.通常のロード付き画像のロード

Glide.with(this)
		.load(url)
		.into(imageView);

2. プレースホルダー画像を使用した読み込み -placeholder()-error()

R.drawable.ic_photo_library和R.drawable.ic_error_outline_black_48dp为自己添加的占位图
RequestOptions requestOptions = new RequestOptions()
                .placeholder(R.drawable.ic_photo_library)
                .error(R.drawable.ic_error_outline_black_48dp);
Glide.with(this)
		.load(url)
		 .apply(requestOptions)
		 .into(imageView);

3. ロードする画像サイズを指定します -override(w,h)

GlideUtil クラスはカプセル化して簡単に使用できます
public class GlideUtil {
    public static void load(Context context,
                     String url,
                     ImageView imageView,
                     RequestOptions requestOptions){
        Glide.with(context)
                .load(url)
                .apply(requestOptions)
                .into(imageView);
    }
}

使用:

//override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINA)加载原图(非压缩)
//注意:此处的Target是com.bumptech.glide.request.target包下的
 RequestOptions options = new RequestOptions()
                .override(200, 100);//(宽, 高)
 GlideUtil.load(this, url, imageView, options);

4. キャッシュの仕組み - CacheStrategy

デフォルトでは、Glide は新しい画像リクエストを開始する前に次のマルチレベル キャッシュをチェックします。

  1. アクティブなリソース - 現在この画像を表示している別のビューはありますか?
  2. メモリ キャッシュ - 画像は最近ロードされ、まだメモリ内にありますか?
  3. リソース タイプ (リソース) - このイメージは以前にデコード、変換され、ディスク キャッシュに書き込まれましたか?
  4. データ ソース (データ) - このイメージの構築に使用されたリソースは、以前にファイル キャッシュに書き込まれましたか?
    最初の 2 つのステップでは、画像がメモリ内にあるかどうかを確認し、メモリ内にある場合は画像を直接返します。最後の 2 つの手順では、イメージがディスク上にあるかどうかを確認して、イメージが迅速かつ非同期で返されるようにします。
    4 つの手順のいずれでも画像が見つからない場合、Glide は元のソースに戻ってデータ (生のファイル、Uri、URL など) を取得します。

一般的に使用される:
1. new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);
diskCacheStrategy() メソッドを呼び出し、DiskCacheStrategy.NONE を渡して、Glide のハードディスク キャッシュ機能を無効にします。
この discCacheStrategy() メソッドは、基本的に Glide ハードディスク キャッシュ機能に関するすべてであり、5 つのパラメータを受け取ることができます。
* DiskCacheStrategy.NONE: コンテンツがキャッシュされていないことを示します。
* DiskCacheStrategy.DATA: 元のイメージのみがキャッシュされることを示します。
* DiskCacheStrategy.RESOURCE: 変換された画像のみがキャッシュされることを示します。
* DiskCacheStrategy.ALL : 元のイメージと変換されたイメージの両方がキャッシュされることを示します。
* DiskCacheStrategy.AUTOMATIC: 画像リソースに応じて使用するキャッシュ戦略を Glide にインテリジェントに選択させることを示します (デフォルト オプション)。
2. Glide は自動的にメモリ キャッシュをオンにし、skipMemoryCache が true であるため、この機能が無効になります。

        RequestOptions options = new RequestOptions()
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.NONE);
        GlideUtil.load(this, url, imageView, options);

5. 読み込み形式を指定します - () 自動認識

Glide 3 の構文は、最初にload()、次にasXXX()です。
Glide 4 では、最初に asXXX() があり、次にload() が続き、通常は with() の直後に続きます。
.asBitmap() メソッドでは、静的画像のみをロードできます。GIF の場合は、最初のフレームがロードされます。
動的な画像をロードするには、AsGif() が必須です。
.asFile() は、指定されたファイル形式の読み込みを強制します。
.asDrawable()、Drawable 形式の読み込みを強制します。

		//R.drawable.ic_photo_library为自己添加的占位图
		RequestOptions options = new RequestOptions()
                .placeholder(R.drawable.ic_photo_library);
        Glide.with(this)
                .load(gifUrl)
                .apply(options)
                .into(imageView);

6-1、コールバックとモニタリング - () にターゲットを渡します

例: into() は LinearLayout などのレイアウト オブジェクトを直接渡すことができないため、Taget を作成します

SimpleTarget<Drawable> target = new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                //resourse是Glide加载出来的图片对象
                linearLayout.setBackground(resource);
            }
        };
Glide.with(this)
         .load(url)
         .into(target);

6-2. コールバックとモニタリング - preload() のプリロード

事前に画像をプリロードし、実際に画像をロードする必要があるときにキャッシュから直接読み取ります。

 Glide.with(this)
                .load(url)
                .preload();
Glide.with(this).load(url).into(imageView);

6-3. コールバックとモニタリング - submit() で画像をダウンロードする

submit() メソッドは画像の元のサイズをダウンロードするために使用され、submit(int width, int height) でダウンロードされる画像のサイズを指定できます。呼び出しの直後に FutureTarget オブジェクトを返し、バックグラウンドで画像をダウンロードします。ダウンロードが完了したら、FutureTarget の get() メソッドを呼び出して、ダウンロードされた画像ファイルを取得します。画像がダウンロードされていない場合は、get()メソッドはスレッドをブロックするため、新しく開いたスレッドをダウンロードします。
スレッド プールを使用することをお勧めします。https://blog.csdn.net/weixin_44565784/article/details/100101695
を参照してください。手順: 1.事前にファイルをコピーして保存するための
ツール クラス (FileUtil.java) を作成します。
スペース、ツール クラス コード 記事のステップ 3 を参照してください: https://blog.csdn.net/weixin_44565784/article/details/100101695
2. 画像をダウンロードします。

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    File file = Glide.with(getApplicationContext())
                    							.asFile()
                    							.load(url)
                    							.submit()
                    							.get();
                    File DCIMdir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsoluteFile();
                    if (!DCIMdir.exists()) {
                        DCIMdir.mkdir();
                    }
                    String fileName = System.currentTimeMillis() + ".jpg";
                    File targetFile = new File(DCIMdir, fileName);
                    //将下载的图片文件复制到本地图片文件
                    FileUtil.copyFile(file, targetFile);
                    Snackbar.make(view, "图片已保存。\n" + targetFile.getPath(), Snackbar.LENGTH_SHORT).show();
                    //通知图库更新
                    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                            Uri.fromFile(new File(targetFile.getParent()))));
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

6-4. コールバックとモニタリング -asBitmap() で画像をダウンロードする

方法は6-3と同様ですが、バージョンが違うのか.toByte[]が使えないので、TargetでBitmapを受け入れてbyte[]に変換します。

SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {

                File DCIMdir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsoluteFile();
                if (!DCIMdir.exists()) {
                    DCIMdir.mkdir();
                }
                String fileName = System.currentTimeMillis() + ".jpg";
                File targetFile = new File(DCIMdir, fileName);
				//bitmap 转 byte[] 
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                resource.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                byte[] bytes = outputStream.toByteArray();
                
                FileUtil.copyByBytes(bytes, targetFile);
                Snackbar.make(view, "图片已保存。\n" + targetFile.getPath(), Snackbar.LENGTH_SHORT).show();
                //通知图库更新
                sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                        Uri.fromFile(new File(targetFile.getParent()))));
            }
        };
        Glide.with(this)
                .asBitmap()
                .load(url)
                .into(target);
    }

6-5. コールバックと監視 -listener() 状態監視

onResourceReady() メソッドで true が返された場合、ターゲットの onResourceReady() メソッドはコールバックされません。

Glide.with(this)
                .load(url)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(imageView);

7-1. 画像変換-transform

transform(…) メソッドでは、パラメータとして実行したい画像変換操作を、既製のパッケージ centerCrop、fitCenter、circleCrop であるtransforms() メソッドに渡すだけです。

RequestOptions requestOptions = new RequestOptions()
                .circleCrop();
GlideUtil.load(this, url, imageView, requestOptions);

7-2. 画像変換 - グライド変換

トリミング変換、カラー変換、ぼかし変換など、多くの一般的な画像変換効果を実装するグライド変換を導入します。

RequestOptions transform = new RequestOptions()
                .fitCenter()
                .transform(new BlurTransformation());
Glide.with(this)
                .load(url)
                .apply(transform)
                .into(imageView);

8. カスタムモジュール - AppGlideModule

AppGlideModuleを継承し、Glideの各種設定を書き換えてカスタマイズを実現する
1. 新しいクラス(MyGlideModule.java)を作成し、AppGlideModuleを継承し、先頭に@GlideModuleアノテーションを追加し、依存関係の追加も忘れずに...:compiler:...、リビルドプロジェクトはGlideAppを使用できます

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context));
    }
}

2. GlideAppを使用する

GlideApp.with(this)
                .load(url)
                .into(imageView);

詳しい紹介: https://www.jianshu.com/p/84932a0eb68b

注: @GlideModule は Glide4 に登録しなくても認識できます
//在Glide4中不需要
  <meta-data
            android:name="完整包名"
            android:value="GlideModule" />

9-1. 生成されたAPIの使用

生成された API を使用します (GlideApp を使用するには、使用する前にカスタム クラスを用意し、 @GlideModule 注釈を追加する必要があります (その中にメソッドを記述する必要はありません)。生成された API は、Glide 4 で導入された新しい機能です。その動作原理は、アノテーション プロセッサ (Annotation Processor) を使用して API を生成することです。アプリケーション モジュールでは、ストリーミング API を使用して、RequestBuilder、RequestOptions、および統合を一度に呼び出すことができます。ライブラリ内のすべてのオプション。

//diskCacheStrategy、placeholder在RequestOptions中
        GlideApp.with(this)
                .load(url)
                .circleCrop()
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .placeholder(R.drawable.ic_photo_library)
                .into(imageView);

9-2. 生成されたAPIカスタムの利用

@GlideExtension と @GlideOption を使用すると、独自の API
1 を作成できます。API クラスをカスタマイズします。注釈を忘れずに追加してください。

@GlideExtension
public class MyAPI {
    /**
     * 构造函数声明成private
     */
    private MyAPI(){}

    /**
     *方法都必须是静态方法,
     * 而且第一个参数必须是RequestOptions,后面你可以加入任意多个你想自定义的参数
     * @param requestOptions
     */
    @GlideOption
    public static BaseRequestOptions<?> cacheSource(BaseRequestOptions<?> requestOptions){
        return requestOptions.override(400, 400);
    }
}

2.使用する

//cacheSource()为自定义的API
GlideApp.with(this)
                .load(url)
                .cacheSource()
                .into(imageView);

- - - - - - - - 以上 - - - - - - - -

おすすめ

転載: blog.csdn.net/weixin_44565784/article/details/100061097