メモ:BitmapロードとCache

3046 ワード

BitmapロードとCache

  • BitmapOptions

  • decodeFile
    decodeStream
    decodeResource
    decodeByteArray
  • BitmapFactory.Options

  • inSampleSize:採用率
    1の場合:サンプリング後の画像は原図と変わりません
    1より大きい:例えば2に等しい場合、サンプリング後のピクチャ幅は元の1/2、画素は元の図の1/4、占有メモリサイズも元の図の1/4である
    10241024のargb 8888フォーマットの画像で、各画素サイズは4 bit(1 bit 8ビット、4つの8は4 bit)、総サイズは102410244=4 MBで、insamplesizeを2に採用した後、総サイズは512512512*4=1 MBである.
    だからinsampleSizeが1より大きい場合にサンプリングスケールがあります
    inSampleSizeは同時に幅の高さに作用し、幅の高さの大きさはサンプリングレートの2次方程式に従って減少し、1/サンプリングレート^2
    inSampleSizeが1未満の場合は1に等しい値で処理します.
    公式提案は2の指数によってinSampleSizeを設定することを提案して、例えば1,2,4,16...
        /* */
        public Bitmap decodeSampledBitmapFromResource(Resources res, @IdRes int id, int reqWidth, int reqHeight) {
            final BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(res, id, opts);
            int outWidth = opts.outWidth;
            int outHeight = opts.outHeight;
    
            int inSampleSize = calculateInSampleSize(outWidth, outHeight, reqWidth, reqHeight);
    
            opts.inJustDecodeBounds = false;
            opts.inSampleSize = inSampleSize;
    
            return BitmapFactory.decodeResource(res, id, opts);
        }
        
            private int calculateInSampleSize(int outWidth, int outHeight, int reqWidth, int reqHeight) {
    
            if (reqHeight == 0 || reqWidth == 0) {
                return 1;
            }
    
            int inSampleSize = 1;
            if (outWidth > reqWidth || outHeight > reqHeight) {
                int w = outWidth / 2;
                int h = outHeight / 2;
    
                while ((w / inSampleSize) >= reqWidth && (h / inSampleSize) >= reqHeight) {
                    inSampleSize *= 2;
                }
            }
            Log.d(TAG, "inSampleSize:" + inSampleSize);
            return inSampleSize;
        }
    
    
  • LruCacheメモリキャッシュ
  • DisLruCacheストレージデバイスキャッシュ
  • LruCache


  • LruCacheは汎用クラスで、内部でLinkedHashMapを維持し、外部のオブジェクトを強く参照して格納し、get、putメソッドを提供してキャッシュオブジェクトの取得と追加を完了し、キャッシュがいっぱいになると、以前に使用したオブジェクトを削除し、新しいオブジェクトを追加します.
  • DiskLruCache


  • SDKのソースコードにはありません.アンドロイド開発者のウェブサイトでダウンロードする必要があります.
    Link
    1.作成:
    public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
                throws IOException {}
    

    4番目のパラメータmaxSizeは、合計サイズを表します.指定した合計サイズを超えると、lruアルゴリズムによって一部のコンテンツが削除されます.
    2.要素の追加
    edit()のEditorオブジェクトを介して、このキャッシュが編集されている場合、edit()はnullを返し、keyに対してMD 5を行うことを提案すると、特殊な文字の面倒を避けることができます.
    エディターを通して新OutputStream()取得出力ストリーム
    エディターを通してcommit()は、Editorを介して書き込みをコミットします.abort()は操作全体を往復し、その後DiskLruCacheを通過する.flush()リフレッシュ.
    3.DiskLruCacheキャッシュ検索
    get(key)メソッドでSnapshotオブジェクトを返し、Snapshot.getInputStream()入力ストリームを取得し、ファイルをロードします.
  • 最適化リストカートン
  • getViewで時間のかかる操作をしない
  • は、スクロール時にピクチャをロードせず、リストが停止したときにのみロードするスクロールイベントをリスニングする.
  • ハードウェアアクセラレータをオン:Activityインベントリファイルノードにandroid:hardwareAccelerated="true"
  • を追加