Glide使用及加載圓形圖片和圓角圖片

本文以glide 3.7版本為例

Glide使用

Glide可以說是安卓開發(fā)者最常使用的圖片加載庫拓轻。它支持本地圖片及網絡圖片的加載,還支持gif的顯示批幌,且API設計靈活易于使用础锐。glide在加載圖片列表時,滾動效果平滑流暢荧缘,這也是它很突出的特點皆警。

在使用3.7版本加載gif時,如果gif較復雜截粗,顯示時有抖動重影問題信姓。實測發(fā)現加載gif的效果不如開源庫android-gif-drawable

基本使用方法:

Glide
    .with(mContext)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .into(imageView);

圓形圖片Transformation

需要自定義Transformation,代碼如下:

package cn.com.***.opensource.glide;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;

public class GlideCircleTransform implements Transformation<Bitmap> {

    private BitmapPool mBitmapPool;

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

    public GlideCircleTransform(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()";
    }
}

圓角圖片Transformation

package cn.com.iyouqu.opensource.glide;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

public class GlideRoundTransform extends BitmapTransformation {
      private static float radius = 0f;
      public GlideRoundTransform(Context context) {
        this(context, 4);
      }
      public GlideRoundTransform(Context context, int dp) {
        super(context);
        radius = Resources.getSystem().getDisplayMetrics().density * dp;
      }
      @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
      }
      private static 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);
      }
}

該方案相對簡單绸罗,只能實現四角全部繪制為圓角意推。可參考開源庫https://github.com/wasabeef/glide-transformations的RoundedCornersTransformation方案珊蟀,可隨意設置圓角類型菊值。該庫提供了多種自定義形狀供學習。

自定義圖形調用方式

Glide
    .with(mContext)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .bitmapTransform(new GlideCircleTransform(mContext)
    .crossFade().diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .into(imageView);

參考:
https://github.com/bumptech/glide glide
https://github.com/wasabeef/glide-transformations glide自定義圖形

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末育灸,一起剝皮案震驚了整個濱河市腻窒,隨后出現的幾起案子,更是在濱河造成了極大的恐慌描扯,老刑警劉巖定页,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異绽诚,居然都是意外死亡典徊,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門恩够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卒落,“玉大人,你說我怎么就攤上這事蜂桶±鼙希” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵扑媚,是天一觀的道長腰湾。 經常有香客問我,道長疆股,這世上最難降的妖魔是什么费坊? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮旬痹,結果婚禮上附井,老公的妹妹穿的比我還像新娘讨越。我一直安慰自己,他們只是感情好永毅,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布把跨。 她就那樣靜靜地躺著,像睡著了一般沼死。 火紅的嫁衣襯著肌膚如雪着逐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天漫雕,我揣著相機與錄音滨嘱,去河邊找鬼峰鄙。 笑死浸间,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吟榴。 我是一名探鬼主播魁蒜,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吩翻!你這毒婦竟也來了兜看?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤细移,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熊锭,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡碗殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了锌妻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代乃。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仿粹,靈堂內的尸體忽然破棺而出搁吓,到底是詐尸還是另有隱情,我是刑警寧澤吭历,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布堕仔,位于F島的核電站毒涧,受9級特大地震影響贮预,放射性物質發(fā)生泄漏贝室。R本人自食惡果不足惜仿吞,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一滑频、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唤冈,春花似錦峡迷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傅物,卻和暖如春夯辖,著一層夾襖步出監(jiān)牢的瞬間董饰,已是汗流浹背蒿褂。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工卒暂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啄栓,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓昙楚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诈嘿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容