Glideを使用してピクチャシリーズの1つをロードし、異なるデータソースからピクチャをロードします.

5685 ワード

他のピクチャローディングライブラリと同様に、Glideはネットワークピクチャのほかにローカルピクチャもロードできます.様々な奇抜なデータソースから画像をロードすることもできます.
ネットワーク画像のロード
多くの場合、私たちがピクチャ・ロード・ライブラリを使用するのは、ネットワーク・ピクチャをロードするためです.ネットワーク操作は複雑なものです.考えてみてください.ピクチャロードライブラリがなければ、手動でピクチャをダウンロードし、ピクチャをキャッシュし、最後にファイルからbitmapを読み取り、Imageviewに設定します.これはまあまあですが、Listviewではもっと頭が痛いです.理由は言わないで、あなたは知っています~~更にいろいろなBitmap操作を加えて、あなたは二度とコードをやめたくないことを保証します.しかもBitmapというものはまだメモリが入っていて、お世话になっていないので、OOMを起こしやすくなり、appがバタバタと消えてしまいます!!
ピクチャ・ロード・ライブラリの利点は、ここにあります.簡単な一言で、ダウンロード、キャッシュ、ロードはすべてできます.まるですばらしい一生のものだ.Glideはこのように人生を美しくするものの一つです.
こんなにたくさん言ったのに、Glideはどうやってネット画像をロードしますか?簡単です.前回の3つの言葉についてです.
ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
String internetUrl = "http://i.imgur.com/idojSYm.png";
Glide
    .with(context)
    .load(internetUrl)
    .into(targetImageView);

木は何かめちゃくちゃなものがあったら、画像をロードするurlに直接伝えればいいです.では、画像ロードライブラリがたくさんありますが、なぜGlideを選んだのでしょうか.スムーズで、特にListviewではないので簡単です.う~ん、みそだ~
ローカルピクチャのロード
次の表は.load()入力可能なパラメータと説明
パラメータ
説明
.load(String string)
stringは、ファイルパス、uri、urlであってもよい
.load(Uri uri)
uriタイプ
.load(File file)
ファイル
.load(Integer resourceId)
リソースId,R.drawable.xxxまたはR.mipmap.xxx
.load(byte[] model)
byte[]タイプ
.load(T model)
カスタムタイプ
Glideは、ネットワークピクチャだけでなく、ローカルピクチャもロードできることがわかります.許容できるパラメータは、ファイルパス、uri、ファイル、リソースidなどです.ほとんどのニーズを基本的に満たしています.ローカルピクチャのロードはネットワークピクチャほど複雑ではありませんが、Glideを使用してローカルピクチャをロードすることをお勧めします.メモリが友好的で、「こっそり」私たちに多くのことをしてくれるからです.例えばメモリキャッシュ,Bitmap多重化,写真方向修正などである.もちろん、さまざまなニーズを満たすためには、画像をロードするだけでは十分ではありません.画像をさまざまに変換する必要があります.つまり、Transformationです.後で詳しく説明します.
カスタム・データ・ソースのロード
前の表の中に私たちがよく知らないものがあります.load(T model)、すなわちカスタムデータソースタイプ.では、どうやって実現するのでしょうか.
実際,カスタムデータソースのロードは主にModelLoaderインタフェースによって実現される.実際のプロジェクトで使ったことがないので、この方面の経験は少ないです.深く知りたいことは、この文章を参考にしてください.
しかし、公式Wikiから見ると、ModelLoaderインタフェースを設計する初心は、異なるサイズの画像をロードするために使われています.周知のように、Androidデバイスの画面解像度は2 Kまで、320 pまで大きい.低解像度の携帯電話に大きな図をロードすると、ユーザーの流量を損なうだけでなく、OOMをもたらしやすい.高解像度の携帯電話では、小さな図をロードするとぼやけてしまい、ユーザー体験が極めて悪い.多くの場合、手間を省くために、多くのappが中間解像度を選択し、サイズを適応します.もちろんそうするのは間違いないが、もっと良い方法があるのに、私たちはどうしてやってみないのだろうか.
では、Glideを使用してこの具体的なニーズを実現するにはどうすればいいのでしょうか.まず、自分のModelLoaderを実現するには、BaseGlideUrlLoaderを継承するのが簡単です.
public interface MyDataModel {
    public String buildUrl(int width, int height);
} 
public class MyUrlLoader extends BaseGlideUrlLoader {
    @Override
    protected String getUrl(MyDataModel model, int width, int height) {
        // Construct the url for the correct size here.
        return model.buildUrl(width, height);
    }
}

次に、画像をロードします.
Glide.with(this)
     .using(new MyUrlLoader(this))
     .load(new MyDataModel() {
          @Override
          public String buidUrl(int width, int height) {
              if (width >= 600) {
                  return url1;
              } else {
                  return url2;
                }
          }
      })
     .into(imageView);

.USing(new MyUrlLoader(this):私たちのModeLoaderを使用します.load(new MyDataModel():カスタマイズしたデータソースをロード
ここではgetUrlの3つのパラメータを説明する必要があります:model:あなたがロードしたデータソースwidth:あなたがロードしたピクチャの幅(px)height:あなたがロードしたピクチャの高さ(px)
このように,高解像度のデバイスに大きな図のurl 1をロードし,低解像度のデバイスに小さな図url 2をロードした.これにより、携帯電話の画素値の大きさに応じて異なるサイズの画像をロードする必要が実現される.
もちろん毎回使いたくないならUSing(new MyUrlLoader()では、カスタムModelLoaderFactoryを実装し、GlideModuleに登録する必要があります.
public class MyGlideModule implements GlideModule {
    ...
    @Override
    public void registerComponents(Context context, Glide glide) {
        glide.register(MyDataModel.class, InputStream.class, 
            new MyUrlLoader.Factory());
    }
}

同時にAndroidManifestでxml宣言


カスタムGlideModuleクラスが複数ある場合は、Android Manifestにもあります.xmlで複数のGlideModuleを宣言します.
上記の異なるサイズの画像をロードするには、Googleの2014年I/O大会Appにこれを紹介する記事があります.住所はここです.大体の原理はこうです.
サービス側には、次のurlをロードできます.
URL
画像サイズ
myserver.com/images/__w-200-400-600-800-1000__/session1.jpg
げんすんぽう
myserver.com/images/w200/session1.jpg
200px
myserver.com/images/w400/session1.jpg
400px
myserver.com/images/w600/session1.jpg
600px
myserver.com/images/w800/session1.jpg
800px
myserver.com/images/w1000/session1.jpg
1000px
では、クライアントはどのようにして異なる携帯電話の解像度に応じて異なるurlをロードしますか?
Googleはこのようにしています.次はコアコードです.
//       
private static final Pattern PATTERN =
      Pattern.compile("__w-((?:-?\\d+)+)__");

@Override
protected String getUrl(String model, int width, int height) {
    Matcher m = PATTERN.matcher(model);
    int bestBucket = 0;
    if (m.find()) {
        String[] found = m.group(1).split("-");//           
        for (String bucketStr : found) {
            bestBucket = Integer.parseInt(bucketStr);
            if (bestBucket >= width) {//          ,      
                // the best bucket is the first immediately
                // bigger than the requested width
                break;
            }
        }
        if (bestBucket > 0) {//       url
            model = m.replaceFirst("w"+bestBucket);
        }
    }
    return model;
}

大まかな手順は以下の通りである:1.サービス側がロード可能なピクチャurlに基づいて正規表現2を定義する.正規マッチングに基づいて、ロード可能なピクチャサイズ配列3を取得する.ロードするImageviewのサイズに応じて、適切なサイズのurl 4を選択します.urlをつなぎ合わせて返す
上記の例では200400606080001000がロード可能であり、ロードするImageviewのサイズが600 pxであれば、配列を600まで遍歴するとループから直接飛び出し、600 pxサイズのピクチャのurlを返し、Glideは600 pxのピクチャをロードします.
最後に小さなdemoを送ります.https://github.com/Alluretears/GldieDemo