1. 程式人生 > >Glide圖片載入庫的使用

Glide圖片載入庫的使用

Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等.可謂是非常的強大.

1.新增Glide庫

需要在build.gradle中加入依賴,目前最新的版本是3.7.0,Glide庫地址

 compile 'com.github.bumptech.glide:glide:3.7.0'

2.載入網路圖片

/**
 * Created by mChenys on 2016/6/6.
 */
public class TestGlideActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); String url = "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"; ImageView targetView = (ImageView) findViewById(R.id.iv_target); Glide.with(this
). load(url). asBitmap(). //強制處理為bitmap into(targetView);//顯示到目標View中 } }

3.載入資源圖片


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        int
resourceId = R.drawable.test; ImageView targetView = (ImageView) findViewById(R.id.iv_target); Glide.with(this). load(resourceId). asBitmap(). into(targetView); } }

4.載入本地檔案圖片


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(file).
                asBitmap().
                into(targetView);
    }
}

5.從Uri中載入

/**
 * Created by mChenys on 2016/6/6.
 */
public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.drawable.test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(uri).
                asBitmap().
                into(targetView);
    }
}

6.載入gif圖片


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.smail).
                asGif().//注意:這裡顯示的指明瞭要載入的是gif圖片,當然即使不指明,glide也會自己判斷.
                into(targetView);
    }
}

效果圖:
這裡寫圖片描述

7.設定預設圖片和載入失敗時顯示的圖片


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                into(targetView);
    }
}

8.淡入顯示效果


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade().//淡入顯示,注意:如果設定了這個,則必須要去掉asBitmap
                into(targetView);
    }
}

另外,crossFade還可以接收一個引數來設定淡入顯示效果的持續時間,crossFade(int duration);
如果你想直接顯示圖片,而不是淡入顯示圖片,則可以通過dontAnimate()方法設定.

9.調整圖片畫素大小


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入顯示的時間,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                into(targetView);
    }
}

10.設定CenterCrop,FitCenter

CenterCrop,FitCenter都是對目標圖片進行裁剪,瞭解過ImageView的ScaleType屬性就知道,這2種裁剪方式在ImageView上也是有的,分別對應ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                into(targetView);
    }
}

11.快取策略設定

記憶體快取設定,通過skipMemoryCache(boolean)來設定是否需要快取到記憶體,預設是會快取到記憶體的.

/**
 * Created by mChenys on 2016/6/6.
 */
public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                into(targetView);
    }
}

磁碟快取,磁碟快取通過diskCacheStrategy(DiskCacheStrategy)來設定,DiskCacheStrategy一共有4種模式:

  1. DiskCacheStrategy.NONE:什麼都不快取
  2. DiskCacheStrategy.SOURCE:僅快取原圖(全解析度的圖片)
  3. DiskCacheStrategy.RESULT:僅快取最終的圖片,即修改了尺寸或者轉換後的圖片
  4. DiskCacheStrategy.ALL:快取所有版本的圖片,預設模式

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                into(targetView);
    }
}

12.快取設定

在GlideModule 中,我們可以設定磁碟快取的位置,磁碟快取的大小和記憶體快取的大小,同時還可以設定圖片的顯示質量.

要是用GlideModule ,需要建立它的實現類,然後在manifests中申明實現類的全類路徑:

  <meta-data
            android:name="com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"
            android:value="GlideModule" />

GlideModule 的實現類,需要實現applyOptions方法:

/**
 * 所以你知道要建立一個額外的類去定製 Glide。
 * 下一步是要全域性的去宣告這個類,讓 Glide 知道它應該在哪裡被載入和使用。
 * Glide 會掃描 AndroidManifest.xml 為 Glide module 的 meta 宣告。
 * 因此,你必須在 AndroidManifest.xml 的 <application> 標籤內去宣告這個SimpleGlideModule。
 * Created by mChenys on 2016/6/10.
 */
public class SimpleGlideModule implements GlideModule {
    public static DiskCache cache;

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 在 Android 中有兩個主要的方法對圖片進行解碼:ARGB8888 和 RGB565。前者為每個畫素使用了 4 個位元組,
        // 後者僅為每個畫素使用了 2 個位元組。ARGB8888 的優勢是影象質量更高以及能儲存一個 alpha 通道。
        // Picasso 使用 ARGB8888,Glide 預設使用低質量的 RGB565。
        // 對於 Glide 使用者來說:你使用 Glide module 方法去改變解碼規則。
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
        //設定快取目錄
        File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);

        cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);// 250 MB 
        builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                return cache;
            }
        });
        //設定memory和Bitmap池的大小
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

        builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
        builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
    }
}

13.設定圖片請求的優先順序

Glide 可以用 Priority 列舉來設定圖片的載入優先順序,這樣我們就可以針對那些需要顯示的圖片設定高的優先順序了.
Priority 有4種級別:
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
例如:

 /**
     * 高優先順序載入
     * @param url
     * @param imageView
     * @param listener
     */
    public static void loadImageWithHighPriority(Object url,ImageView imageView, final LoaderListener listener) {
        if (url == null) {
            if (listener != null) {
                listener.onError();
            }
        } else {
            Glide.with(imageView.getContext()).
                    load(url).
                    asBitmap().
                    priority(Priority.HIGH).//高優先順序
                    dontAnimate().
                    listener(new RequestListener<Object, Bitmap>() {
                        @Override
                        public boolean onException(Exception e, Object model, Target<Bitmap> target, boolean isFirstResource) {
                            if (null != listener) {
                                listener.onError();
                            }
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            if (null != listener) {
                                listener.onSuccess();
                            }
                            return false;
                        }
                    }).into(imageView);
        }
    }

14.設定載入縮圖

通過設定縮圖,我們可以在顯示目標圖片之前先展示一個第解析度或者其他圖片,當全解析度的目標圖片在後臺載入完成後,
Glide會自動切換顯示全畫素的目標圖片.

設定縮圖有2種方式:
通過thumbnail(float)指定0.0f~1.0f的原始影象大小,例如全畫素的大小是500*500,如果設定為thumbnail為0.1f,即目標圖片的10%,顯示的縮圖大小就是50*50;


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);

        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                thumbnail(0.1f).//10%的原圖大小
                into(targetView);
    }
}

通過thumbnail(DrawableRequestBuilder)方式來指定縮圖,該縮圖可以使用load的所有方式(網路,檔案,uri,資源)載入.


public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        //縮圖請求
        DrawableRequestBuilder<String> thumbnailRequest = Glide
                .with(this)
                .load("http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png");

        Glide.with(this).
                load(R.drawable.test).
//                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
//                error(R.drawable.bg_error).//載入失敗時顯示的圖片
//                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                thumbnail(thumbnailRequest).//設定縮圖
                into(targetView);
    }
}

15.Transformations Bitmap

在顯示目標圖片之前,我們可以對目標圖片的Bitmap進行相應的處理,例如::圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等.
只需要實現Transformation介面即可,該介面的transform方法會返回顯示圖片前的Bitmap物件,在該方法中對
Bitmap的任何處理,都會影響到最終的顯示結果.
當然,如果你只是想要對圖片做常規的 bitmap 轉換,你可以繼承抽象類BitmapTransformation,它簡化了Transformation介面的實現,這應該能覆蓋大部分的應用場景了。

使用的時候,通過transform(Transformation… transformations)來設定.例如:

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                transform(new BlurTransformation(this)).//高斯模糊處理
                into(targetView);
    }
}

下面貼出常用的幾個Bitmap的轉換處理的程式碼,在github上也有glide-transformations-master庫.

圓圖處理

public class CropCircleTransformation implements Transformation<Bitmap> {

    private BitmapPool mBitmapPool;

    public CropCircleTransformation(Context context) {
        this(Glide.get(context).getBitmapPool());
    }

    public CropCircleTransformation(BitmapPool pool) {
        this.mBitmapPool = pool;
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();
        int size = Math.min(source.getWidth(), source.getHeight());

        int width = (source.getWidth() - size) / 2;
        int height = (source.getHeight() - size) / 2;

        Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader =
                new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        if (width != 0 || height != 0) {
            // source isn't square, move viewport to center
            Matrix matrix = new Matrix();
            matrix.setTranslate(-width, -height);
            shader.setLocalMatrix(matrix);
        }
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        return BitmapResource.obtain(bitmap, mBitmapPool);
    }

    @Override public String getId() {
        return "CropCircleTransformation()";
    }
}

圓角處理

public class RoundedCornersTransformation implements Transformation<Bitmap> {

    private BitmapPool mBitmapPool;

    private int radius;
    private int margin;

    public RoundedCornersTransformation(Context context, int radius, int margin) {
        this(Glide.get(context).getBitmapPool(), radius, margin);
    }

    public RoundedCornersTransformation(BitmapPool pool, int radius, int margin) {
        mBitmapPool = pool;
        this.radius = radius;
        this.margin = margin;
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();

        int width = source.getWidth();
        int height = source.getHeight();

        Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        canvas.drawRoundRect(new RectF(margin, margin, width - margin, height - margin), radius, radius,
                paint);

        return BitmapResource.obtain(bitmap, mBitmapPool);
    }

    @Override public String getId() {
        return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ")";
    }
}

灰度處理

public class GrayscaleTransformation implements Transformation<Bitmap> {

    private BitmapPool mBitmapPool;

    public GrayscaleTransformation(Context context) {
        this(Glide.get(context).getBitmapPool());
    }

    public GrayscaleTransformation(BitmapPool pool) {
        mBitmapPool = pool;
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();

        int width = source.getWidth();
        int height = source.getHeight();

        Bitmap.Config config =
                source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
        Bitmap bitmap = mBitmapPool.get(width, height, config);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(width, height, config);
        }

        Canvas canvas = new Canvas(bitmap);
        ColorMatrix saturation = new ColorMatrix();
        saturation.setSaturation(0f);
        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(saturation));
        canvas.drawBitmap(source, 0, 0, paint);

        return BitmapResource.obtain(bitmap, mBitmapPool);
    }

    @Override public String getId() {
        return "GrayscaleTransformation()";
    }
}

旋轉處理

public class RotateTransformation extends BitmapTransformation {

    private float rotateRotationAngle = 0f;

    public RotateTransformation(Context context, float rotateRotationAngle) {
        super(context);

        this.rotateRotationAngle = rotateRotationAngle;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        Matrix matrix = new Matrix();

        matrix.postRotate(rotateRotationAngle);

        return Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);
    }

    @Override
    public String getId() {
        return "rotate" + rotateRotationAngle;
    }
}

高斯模糊處理

public class BlurTransformation implements Transformation<Bitmap> {

    private static int MAX_RADIUS = 25;
    private static int DEFAULT_DOWN_SAMPLING = 1;

    private Context mContext;
    private BitmapPool mBitmapPool;

    private int mRadius;
    private int mSampling;

    public BlurTransformation(Context context) {
        this(context, Glide.get(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, BitmapPool pool) {
        this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, BitmapPool pool, int radius) {
        this(context, pool, radius, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, int radius) {
        this(context, Glide.get(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, BitmapPool pool, int radius, int sampling) {
        mContext = context;
        mBitmapPool = pool;
        mRadius = radius;
        mSampling = sampling;
    }

    public BlurTransformation(Context context, int radius, int sampling) {
        mContext = context;
        mBitmapPool = Glide.get(context).getBitmapPool();
        mRadius = radius;
        mSampling = sampling;
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();

        int width = source.getWidth();
        int height = source.getHeight();
        int scaledWidth = width / mSampling;
        int scaledHeight = height / mSampling;

        Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        canvas.scale(1 / (float) mSampling, 1 / (float) mSampling);
        Paint paint = new Paint();
        paint.setFlags(Paint.FILTER_BITMAP_FLAG);
        canvas.drawBitmap(source, 0, 0, paint);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            try {
                bitmap = RSBlur.blur(mContext, bitmap, mRadius);
            } catch (RSRuntimeException e) {
                bitmap = FastBlur.blur(bitmap, mRadius, true);
            }
        } else {
            bitmap = FastBlur.blur(bitmap, mRadius, true);
        }

        return BitmapResource.obtain(bitmap, mBitmapPool);
    }

    @Override public String getId() {
        return "BlurTransformation(radius=" + mRadius + ", sampling=" + mSampling + ")";
    }
}

網上提供的FastBlur,可相容低版本的高斯模糊處理

public class FastBlur {

    public static Bitmap blur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {

        Bitmap bitmap;
        if (canReuseInBitmap) {
            bitmap = sentBitmap;
        } else {
            bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
        }

        if (radius < 1) {
            return (null);
        }

        int w = bitmap.getWidth();
        int h = bitmap.getHeight();

        int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);

        int wm = w - 1;
        int hm = h - 1;
        int wh = w * h;
        int div = radius + radius + 1;

        int r[] = new int[wh];
        int g[] = new int[wh];
        int b[] = new int[wh];
        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
        int vmin[] = new int[Math.max(w, h)];

        int divsum = (div + 1) >> 1;
        divsum *= divsum;
        int dv[] = new int[256 * divsum];
        for (i = 0; i < 256 * divsum; i++) {
            dv[i] = (i / divsum);
        }

        yw = yi = 0;

        int[][] stack = new int[div][3];
        int stackpointer;
        int stackstart;
        int[] sir;
        int rbs;
        int r1 = radius + 1;
        int routsum, goutsum, boutsum;
        int rinsum, ginsum, binsum;

        for (y = 0; y < h; y++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            for (i = -radius; i <= radius; i++) {
                p = pix[yi + Math.min(wm, Math.max(i, 0))];
                sir = stack[i + radius];
                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);
                rbs = r1 - Math.abs(i);
                rsum += sir[0] * rbs;
                gsum += sir[1] * rbs;
                bsum += sir[2] * rbs;
                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }
            }
            stackpointer = radius;

            for (x = 0; x < w; x++) {

                r[yi] = dv[rsum];
                g[yi] = dv[gsum];
                b[yi] = dv[bsum];

                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

                if (y == 0) {
                    vmin[x] = Math.min(x + radius + 1, wm);
                }
                p = pix[yw + vmin[x]];

                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);

                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

                stackpointer = (stackpointer + 1) % div;
                sir = stack[(stackpointer) % div];

                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

                yi++;
            }
            yw += w;
        }
        for (x = 0; x < w; x++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            yp = -radius * w;
            for (i = -radius; i <= radius; i++) {
                yi = Math.max(0, yp) + x;

                sir = stack[i + radius];

                sir[0] = r[yi];
                sir[1] = g[yi];
                sir[2] = b[yi];

                rbs = r1 - Math.abs(i);

                rsum += r[yi] * rbs;
                gsum += g[yi] * rbs;
                bsum += b[yi] * rbs;

                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }

                if (i < hm) {
                    yp += w;
                }
            }
            yi = x;
            stackpointer = radius;
            for (y = 0; y < h; y++) {
                // Preserve alpha channel: ( 0xff000000 & pix[yi] )
                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];

                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

                if (x == 0) {
                    vmin[y] = Math.min(y + r1, hm) * w;
                }
                p = x + vmin[y];

                sir[0] = r[p];
                sir[1] = g[p];
                sir[2] = b[p];

                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

                stackpointer = (stackpointer + 1) % div;
                sir = stack[stackpointer];

                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

                yi += w;
            }
        }

        bitmap.setPixels(pix, 0, w, 0, 0, w, h);

        return (bitmap);
    }
}

RenderScript處理高斯模糊

android4.3之後可使用,需要在build.gradle中配置:

defaultConfig {

        //BlurTransformation
        renderscriptTargetApi 23
        renderscriptSupportModeEnabled true
}
public class RSBlur {

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static Bitmap blur(Context context, Bitmap blurredBitmap, int radius) throws RSRuntimeException {
        try {
            RenderScript rs = RenderScript.create(context);
            Allocation input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_NONE,
                    Allocation.USAGE_SCRIPT);
            Allocation output = Allocation.createTyped(rs, input.getType());
            ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));

            blur.setInput(input);
            blur.setRadius(radius);
            blur.forEach(output);
            output.copyTo(blurredBitmap);
            rs.destroy();
        } catch (RSRuntimeException e) {
            blurredBitmap = FastBlur.blur(blurredBitmap, radius, true);
        }
        return blurredBitmap;
    }
}

16.動畫處理

通過animate()方法可以設定xml檔案定義的4種補間動畫(alpha、scale、translate、rotate)
例如:

res\anim\left_in.xml


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="-50%p"
        android:toXDelta="0"/>
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

使用方式:

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                animate(R.anim.left_in).//載入xml檔案定義的動畫
                into(targetView);
    }
}

處理此外,還可以通過animate指定屬性動畫:

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);

        ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
            @Override
            public void animate(View view) {
                //設定屬性動畫
                ObjectAnimator moveIn = ObjectAnimator.ofFloat(view, "translationX", -500f, 0f);
                ObjectAnimator rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);
                ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);
                ObjectAnimator moveTop = ObjectAnimator.ofFloat(view, "translationY", 0f, -2000, 0f);
                AnimatorSet animSet = new AnimatorSet();
                //先左進,然後旋轉伴隨淡入效果,最後移動向上
                animSet.play(rotate).with(fadeInOut).after(moveIn).before(moveTop);
                animSet.setDuration(5000);
                animSet.start();
            }
        };
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                animate(animationObject).//載入屬性動畫
                into(targetView);
    }
}

相關推薦

Android Glide圖片入庫的使用

簡介 Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等

(原創)詳解Glide圖片入庫常用方法

Glide作為安卓開發常用的圖片載入庫,有許多實用而且強大的功能,那麼,今天就來總結一番,這次把比較常見的都寫出來,但並不是全部哦。 在介紹之前,先來說說什麼是Glide吧: 在泰國舉行的谷歌開發

Glide 圖片入庫的坑

 1:CircleImageView 使用Glide 載入時,設定placeholder,導致圖片不顯示        // 解決:加上.dontAnimate()        .placeholder(R.mipmap.mine_placehold)       

Glide圖片入庫的使用

Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動

Aandroid 圖片入庫Glide 實戰(一),初始,載入進階到實踐

   原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay初識Glide為何使用 Glide? 有經驗的 Android 開發者可以跳過這節,但對於初學者來說,你可能會問自己為什麼你想要去用 Gl

圖片入庫Glide——解決圖片錯亂+無法設定tag

今天在寫一個圖片載入類ImageLoader,在使用的時候想用Glide替代我寫的ImageLoader,然後問題就出來了!!! 第一個問題:在使用自己寫的ImageLoader的時候,為了防止item複用導致的圖片錯亂,設定了Tag 如下程式碼

Google推薦的圖片入庫Glide介紹

在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 毫無疑問,這個庫引起了我的興趣。於是我花了一個晚上研究和

Android圖片入庫:最全面解析Glide用法

前言 上文已經對當今Android主流的圖片載入庫進行了全面介紹 & 對比 如果你還沒閱讀,我建議你先移步這裡進行檢視 今天我們來學習一下其中一個Android主流的圖片載入庫的使用 - Glide 目錄 1. 簡

Android圖片入庫Picasso和Glide

之前一直使用,沒有仔細的研究過框架,今天開始想對之前用的框架了解一下,後面打算研究一下原始碼。今天做了一個簡單的瞭解,對兩個框架進行對比。 先說說不同之處: 1.大小,Glide是Picasso的三倍左右 2.GIF圖,Glide支援載入GIF圖,

Google推薦的圖片入庫Glide介紹及使用

在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 毫無疑問,這個庫引起了我的興趣。於是我花了一個晚上研究和

Google推薦的圖片入庫Glide於Picasso比較

在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 Glide和Picasso有90%的相似度,準確

FaceBook推出的Android圖片入庫-Fresco

一次 人員 的人 java代碼 jpeg markdown 開發 改變 水平 歡迎關註ndroid-tech-frontier開源項目,定期翻譯國外Android優質的技術、開源庫、軟件架構設計、測試等文章 原文鏈接:Intro

Android圖片入庫的理解

前言        這是“基礎自測”系列的第三篇文章,以Android開發需要熟悉的20個技術點為切入點,本篇重點講講Android中的ImageLoader這個庫的一些理解,在Android上最讓人頭疼是從網路中獲取圖片,顯示,回收,任何一個環節有問題都可能直接OOM,當需要載入大量的圖片的時

Fresco圖片入庫常見問題

1、android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating c

android圖片入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)

我想大多數人在自己的專案中還是使用Glide3.7.1這個版本吧!不過Glide版本現在已經到4.4.0了! 當我們把Glide3更換成Glide4,會發現大部分地方都報錯了,那麼該怎樣快速替換Glide3為Glide4呢? 下面我們一起來看看怎樣實現Gli

Android圖片入庫的封裝實戰

重磅更新 || 2017-02-16 使用ImageLoaderUtil實現一個真正意義的圖集功能,持續完善和更新中 重要的東西貼三遍! 2017-05-09 || 優化圓形圖片載入 更新demo 前言 圖片載

開源圖片入庫universal-image-loader使用

ImageLoader | | - init(ImageLoaderConfiguration) | - isInited() | - displayImage(...) | - loadImage(...)

Android圖片入庫—Fresco一個強大的圖片載入元件

介紹 Fresco支援Android2.3(API level 9)及其以上系統。 依賴 由於我用的是android studio所以這裡就只是說一下android studio下如何配置,在強大的gradle,只需要一句話搞定,gr

3分鐘全面瞭解Android主流圖片入庫

前言 圖片載入在 Android開發專案中非常常見,為了降低開發週期和難度,我們經常會選用一些圖片載入的開源庫,而現在圖片載入開源庫越來越多,我們應該選用哪種呢?今天我就給大家分別介紹 & 對比現今主流的圖片載入框架。 目錄

Android-->Facebook圖片入庫Fresco(愛它的理由)

在Android中,圖片載入框架很多,很多,很多…都是經典,爆款. Fresco 的 Image Pipeline 負責圖片的獲取和管理。圖片可以來自遠端伺服器,本地檔案,或者Content