Glide學習歸納三 變化效果

圖片轉(zhuǎn)換

Glide給我們提供好了一個圖片變換的框架节吮。我們可以對圖片進行圓形化残邀,圓角化屑咳,黑白化萨赁,模糊化,甚至可以把一張圖片完全轉(zhuǎn)變成另外一張圖片兆龙。

這里需要使用到.transform()這個api杖爽。

而這中間需要傳入的參數(shù),如果是快速開發(fā)的話紫皇,可以去搜索一下慰安,然后復制到自己的代碼引用就好了。不管是自己寫的還是網(wǎng)絡(luò)別人寫的坝橡,都是繼承于BitmapTransformation 泻帮,然后重寫transform()方法精置,并在這里去實現(xiàn)具體的圖片變換邏輯就可以了计寇。比如一個圓形化有這樣兩種:

版本一

public class GlideCircleTransform extends BitmapTransformation {
    public GlideCircleTransform(Context context) {
        super(context);
    }

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

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;
        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}
版本二
public class CircleCrop extends BitmapTransformation {

    public CircleCrop(Context context) {
        super(context);
    }

    public CircleCrop(BitmapPool bitmapPool) {
        super(bitmapPool);
    }

    @Override
    public String getId() {
        return "com.example.glidetest.CircleCrop";
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        int diameter = Math.min(toTransform.getWidth(), toTransform.getHeight());

        final Bitmap toReuse = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
        final Bitmap result;
        if (toReuse != null) {
            result = toReuse;
        } else {
            result = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888);
        }

        int dx = (toTransform.getWidth() - diameter) / 2;
        int dy = (toTransform.getHeight() - diameter) / 2;
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, 
                                            BitmapShader.TileMode.CLAMP);
        if (dx != 0 || dy != 0) {
            Matrix matrix = new Matrix();
            matrix.setTranslate(-dx, -dy);
            shader.setLocalMatrix(matrix);
        }
        paint.setShader(shader);
        paint.setAntiAlias(true);
        float radius = diameter / 2f;
        canvas.drawCircle(radius, radius, radius, paint);

        if (toReuse != null && !pool.put(toReuse)) {
            toReuse.recycle();
        }
        return result;
    }
}

復制兩端代碼的目的主要不是說真的要懂怎么寫,而是主要是了解如果我們要自定義變化模板的時候要怎么入手,或者清楚整個流程番宁。
可以發(fā)現(xiàn)這些模板都是繼承于BitmmapTransformation(只能對靜態(tài)圖做變化元莫,不過也幾乎滿足開發(fā)需要,有些如果要對gif做變化蝶押,也可以通過繼承Transformation這個父類來實現(xiàn)踱蠢,反正我是不會)

這里有一點需要注意,就是getId()方法中要求返回一個唯一的字符串來作為id棋电,以和其他的圖片變換做區(qū)分茎截。通常情況下,我們直接返回當前類的完整類名就可以了赶盔。

而具體實現(xiàn)的邏輯在transform()中書寫企锌,transform()方法中有四個參數(shù),第一個參數(shù)pool于未,這個是Glide中的一個Bitmap緩存池撕攒,用于對Bitmap對象進行重用,否則每次圖片變換都重新創(chuàng)建Bitmap對象將會非常消耗內(nèi)存烘浦。第二個參數(shù)toTransform抖坪,這個是原始圖片的Bitmap對象,我們就是要對它來進行圖片變換闷叉。第三和第四個參數(shù)比較簡單擦俐,分別代表圖片變換后的寬度和高度,其實也就是override()方法中傳入的寬和高的值了握侧。

最后捌肴,網(wǎng)上其實已經(jīng)有很多不錯的Glide圖片轉(zhuǎn)化庫https://github.com/wasabeef/glide-transformations
區(qū)別在于:用法稍微不同藕咏,庫里使用的api不是.trasform()状知,而是bitmapTransform()。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孽查,一起剝皮案震驚了整個濱河市饥悴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盲再,老刑警劉巖西设,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異答朋,居然都是意外死亡贷揽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門梦碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禽绪,“玉大人蓖救,你說我怎么就攤上這事∮∑ǎ” “怎么了循捺?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雄人。 經(jīng)常有香客問我从橘,道長,這世上最難降的妖魔是什么础钠? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任恰力,我火速辦了婚禮,結(jié)果婚禮上旗吁,老公的妹妹穿的比我還像新娘牺勾。我一直安慰自己,他們只是感情好阵漏,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布驻民。 她就那樣靜靜地躺著,像睡著了一般履怯。 火紅的嫁衣襯著肌膚如雪回还。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天叹洲,我揣著相機與錄音柠硕,去河邊找鬼。 笑死运提,一個胖子當著我的面吹牛蝗柔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播民泵,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼癣丧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栈妆?” 一聲冷哼從身側(cè)響起胁编,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳞尔,沒想到半個月后嬉橙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寥假,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年市框,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕韧。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫振,死狀恐怖喻圃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒋得,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布乒疏,位于F島的核電站额衙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怕吴。R本人自食惡果不足惜窍侧,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望转绷。 院中可真熱鬧伟件,春花似錦、人聲如沸议经。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煞肾。三九已至咧织,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間籍救,已是汗流浹背习绢。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝙昙,地道東北人闪萄。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像奇颠,于是被迫代替她去往敵國和親败去。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容