Android写真キャッシュの初見Glide(三)


前言:
前のまとめは画像の使用とLruアルゴリズムを学びました。今日は比較的優れた画像キャッシュのオープンフレームを学びます。技術自体はどんどん交替します。最初の自分でソフトレferenceを使って自分のイメージキャッシュを実現してから、エレクトビジネスプロジェクトの自分の実現方案を作ってプロジェクトの需要を満足できなくなって、Afinalを変更します。アイフィナールはもうメンテナンスしないので、同じドアのXutilsを選択しました。中には他のオープンソースフレーム、たとえばPicassoにも接触しました。Picassoの第一回の印象はよくないです。初めての接触は外注会社から受け取ったばかりの写真社交類アプリです。メモリの占有率が大きすぎて、直接に感じたのはListViewのスライドがちょっとカードトンになっています。古いキャッシュフレームはuniversalImageLoaderが聞いたことがあります。今までは本当に使ったことがないということです。プロジェクトは全部小さいです。最近はプロジェクトが大きくなったと思いますが、もしXutilsがメンテナンスされなくなったり、サポートを求める画像フォーマットが多くなったりしたら、Xutilsがベスト選択ではないかもしれません。本当はFacebookのフレスコのフレームワークを勉強したいと思っていましたが、簡単に見ました。カスタマイズコントロールと一緒に使う必要があります。機能は強いですが、メンテナンスしているプロジェクトの修正コストはそんなに高くないです。後で興味があります。 
Glide概要:
GlideはGoogle社員のオープンソースプロジェクトです。Google I/Oで推奨されています。効率的、オープンソース、Androidデバイス上のメディア管理フレームワークは、BSD、MIT、Appache 2.0プロトコルに従って発表されています。Glideはビデオのスナップショット、写真、アニメーションなどの機能を獲得、復号し、展示しています。これらのAPIは、開発者がGlideをほとんどのネットワークプロトコルスタックに応用できるようにしています。Glideを作成する主な目的は二つあります。一つは滑らかな画像リストのスクロール効果を実現すること、もう一つはリモート画像の取得、サイズ調整、展示をサポートすることです。
 gitHubアドレス:https://github.com/bumptech/glide 
Glideの特徴
 •使うのは簡単です
 •配置可能度が高く、適応度が高い。
 •よくあるピクチャーのフォーマットJpg png gif webpを支持します。
 •複数のデータソースをサポートします。  ネットワーク、ローカル、リソース、Asetsなど
 •効率的キャッシュポリシー    MemoryとDiskピクチャキャッシュ対応のデフォルトBitmapフォーマットはRGB_を採用しています。565メモリの使用量は少なくとも半分減少しました。
 •ライフサイクル   Activity/Fragmentライフサイクル自動管理要求によると
 •Bitmapを効率的に処理する  Bitmap Poolを使用してBitmapを多重化し、recycleを積極的に呼び出して回収するBitmapを回収し、システム回収圧力を低減する。 
Glideは簡単に使います
 1.参照build.gradleにプロファイルを追加する
 comple'comp.githb.bumptech.glide:3.7.0'
2.バインディングライフサイクルの設定 
私たちはより効率的にGlideで提供された方法で結合できます。画像をロードする要求のライフサイクルを動的に管理することができます。 

 Glide.with(Context context);//   Context
 Glide.with(Activity activity);//   Activity
 Glide.with(FragmentActivity activity);//   FragmentActivity
 Glide.with(Fragment fragment);//   Fragment 
3.簡単な画像の読み込み例 
 Glide.with.load.into(imageView);
4.)ロード中の設定と失敗画像の読み込み 
apiの中でplacholder()、error()の関数の中に多形実現用がある時に詳しく知ることができます。
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView); 
5.メモリキャッシュをスキップする設定 
 Glide.with.load.skyMemoryCache.into(imagewiw);
6.)ダウンロードの優先度を設定する 
Glide.with.load.priority(Priority.NORMAL).into(imagView)
7.キャッシュポリシーの設定 
Glide.with.load.disk CacheStrategy(DiscCacheStrategy.ALL).into(imagew);
ポリシー解説: 
all:キャッシュソースと変換後のリソース 
none:ディスクキャッシュを行わない 
ソースリソース 
キャッシュ変換後のリソース 
8.)アニメーションの読み込み設定 
apiもいくつかのよく使われているアニメーションを提供しています。例えば、crossFade() 
  Glide.with.load.animate(R.anim.item_アルファin)into(imagew);R.anim.item_アルファin

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <alpha
    android:duration="500"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"/>
</set>
9.)サムネイルサポートの設定 
サムネイルを先に読み込んで全図をロードします。 
 Glide.with.load.thumbnail(0.1 f).into(imageView);
10.)ロードサイズの設定 
 Glide.with(this).load(imagUrl).override(800,800).into(imagView)
11.ダイナミック変換設定 
 Glide.with.load.center Crop().into(imageView) 
apiは、例えば、center Crop()、fit Center()などの関数を提供しています。また、カスタムTrans formationを通じて、例えば、一人の角変換器などの例を示しています。 

 public class GlideRoundTransform extends BitmapTransformation {
  private float radius = 0f;
  public GlideRoundTransform(Context context) {
   this(context, 4);
  }

  public GlideRoundTransform(Context context, int dp) {
   super(context);
   this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
  }

  @Override
  protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
   return roundCrop(pool, toTransform);
  }

  private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
   if (source == null) return null;

   Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
   if (result == null) {
    result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
   }
   Canvas canvas = new Canvas(result);
   Paint paint = new Paint();
   paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
   paint.setAntiAlias(true);
   RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
   canvas.drawRoundRect(rectF, radius, radius, paint);
   return result;
  }

  @Override
  public String getId() {
   return getClass().getName() + Math.round(radius);
  }
 }

具体的に使う 
Glide.with.load.transform(new GlideRoundTrans form)into(imageView)
12.ロードする内容を設定する 
プロジェクトの中には、まず写真をダウンロードしてから、いくつかの合成機能を行う必要があります。例えば、プロジェクトの中に出てくる図と文字の混合列は、どうやって目標を達成するべきですか? 

 Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {
   @Override
   public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
    imageView.setImageDrawable(resource);
   }
  });
13)傍受要求インターフェースの設定 

 Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
   @Override
   public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
    return false;
   }

   @Override
   public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
    //imageView.setImageDrawable(resource);
    return false;
   }
  }).into(imageView);

傍受を設定するための機能は、エラー発生源を監視するために使用することができます。また、画像ソースはメモリですか?それともディスクですか? 
14)ダイナミックGIFロード方式の設定  

Glide.with(this).load(imageUrl).asBitmap().into(imageView);//  gif    
 Glide.with(this).load(imageUrl).asGif().into(imageView);//  gif     
 15)キャッシュのダイナミッククリーンアップ  

Glide.get(this).clearDiskCache();//                
 Glide.get(this).clearMemory();//          UI       
以上はGlideの一般的な使い方です。基本的に開発ニーズを満たしています。他の関連知識を勉強してください。