2018-01-23 Android中Glide加載圓形圖片和圓角圖片實(shí)例代碼

一、簡(jiǎn)介:

介紹兩種使用 BitmapTransformation 來(lái)實(shí)現(xiàn) Glide 加載圓形圖片和圓角圖片的方法。Glide 并不能直接支持 Round Pictures ,需要使用 BitmapTransformation 來(lái)進(jìn)行處理。

二、網(wǎng)上的實(shí)現(xiàn)方式

這里介紹下網(wǎng)上常見的方式和使用 RoundedBitmapDrawable 兩種方法,本質(zhì)上是差不多的:

使用 Canvas 和 Paint 來(lái)繪制

使用 Android.support.v4.graphics.drawable.RoundedBitmapDrawable

實(shí)現(xiàn)圓形圖片:

/**

?*

?* Glide 圓形圖片 Transform

?*/


publicclassGlideCircleTransform extendsBitmapTransformation {

??publicGlideCircleTransform(Context context) {

????super(context);

??}


??@Override

??protectedBitmap transform(BitmapPool pool, Bitmap toTransform, intoutWidth, intoutHeight) {

????returncircleCrop(pool, toTransform);

??}


??privatestaticBitmap circleCrop(BitmapPool pool, Bitmap source) {

????if(source == null) returnnull;

????intsize = Math.min(source.getWidth(), source.getHeight());

????intx = (source.getWidth() - size) / 2;

????inty = (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 = newCanvas(result);

????Paint paint = newPaint();

????paint.setShader(newBitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

????paint.setAntiAlias(true);

????floatr = size / 2f;

????canvas.drawCircle(r, r, r, paint);

????returnresult;

??}


??@Override

??publicString getId() {

????returngetClass().getName();

??}

}

實(shí)現(xiàn)圓角圖片:

/**

?* Glide 圓角 Transform

?*/


publicclassGlideRoundTransform extendsBitmapTransformation {


??privatestaticfloatradius = 0f;


??/**

?* 構(gòu)造函數(shù) 默認(rèn)圓角半徑 4dp

?*

?* @param context Context

?*/

??publicGlideRoundTransform(Context context) {

????this(context, 4);

??}


??/**

?* 構(gòu)造函數(shù)

?*

?* @param context Context

?* @param dp 圓角半徑

?*/

??publicGlideRoundTransform(Context context, intdp) {

????super(context);

????radius = Resources.getSystem().getDisplayMetrics().density * dp;

??}


??@Override

??protectedBitmap transform(BitmapPool pool, Bitmap toTransform, intoutWidth, intoutHeight) {

????returnroundCrop(pool, toTransform);

??}


??privatestaticBitmap roundCrop(BitmapPool pool, Bitmap source) {

????if(source == null) returnnull;


????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 = newCanvas(result);

????Paint paint = newPaint();

????paint.setShader(newBitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

????paint.setAntiAlias(true);

????RectF rectF = newRectF(0f, 0f, source.getWidth(), source.getHeight());

????canvas.drawRoundRect(rectF, radius, radius, paint);

????returnresult;

??}


??@Override

??publicString getId() {

????returngetClass().getName() + Math.round(radius);

??}

}

三、筆者比較喜歡的簡(jiǎn)便的實(shí)現(xiàn)方式

//加載圓角圖片

???publicstaticvoidloadRoundImage(finalContext context, String url,finalImageView imageView){

?????Glide.with(context)

?????????.load(url)

?????????.asBitmap()

?????????.placeholder(placeholder)

?????????.error(placeholder)

?????????.diskCacheStrategy(DiskCacheStrategy.ALL) //設(shè)置緩存

?????????.into(newBitmapImageViewTarget(imageView){

???????????@Override

???????????protectedvoidsetResource(Bitmap resource) {

?????????????super.setResource(resource);

?????????????RoundedBitmapDrawable circularBitmapDrawable =

?????????????????RoundedBitmapDrawableFactory.create(context.getResources(), resource);

?????????????circularBitmapDrawable.setCornerRadius(10); //設(shè)置圓角弧度

?????????????imageView.setImageDrawable(circularBitmapDrawable);

???????????}

?????????});

???}



??//加載圓形圖片

??publicstaticvoidloadCirclePic(finalContext context, String url, finalImageView imageView) {

????Glide.with(context)

????????.load(url)

????????.asBitmap()

????????.placeholder(placeholder)

????????.error(placeholder)

????????.diskCacheStrategy(DiskCacheStrategy.ALL) //設(shè)置緩存

????????.into(newBitmapImageViewTarget(imageView) {

??????????@Override

??????????protectedvoidsetResource(Bitmap resource) {

????????????RoundedBitmapDrawable circularBitmapDrawable =

????????????????RoundedBitmapDrawableFactory.create(context.getResources(), resource);

????????????circularBitmapDrawable.setCircular(true);

????????????imageView.setImageDrawable(circularBitmapDrawable);

??????????}

????????});


??}

關(guān)于drawableToBitmap的源碼的實(shí)現(xiàn)是這樣的

publicstaticBitmap drawableToBitmap(Drawable drawable) {

????// 取 drawable 的長(zhǎng)寬

????intw = drawable.getIntrinsicWidth();

????inth = drawable.getIntrinsicHeight();


????// 取 drawable 的顏色格式

????Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888

????????: Bitmap.Config.RGB_565;

????// 建立對(duì)應(yīng) bitmap

????Bitmap bitmap = Bitmap.createBitmap(w, h, config);

????// 建立對(duì)應(yīng) bitmap 的畫布

????Canvas canvas = newCanvas(bitmap);

????drawable.setBounds(0, 0, w, h);

????// 把 drawable 內(nèi)容畫到畫布中

????drawable.draw(canvas);

????returnbitmap;

??}

/**

?* RoundedBitmapDrawable 是 V4 下的一個(gè)類,不能簡(jiǎn)單的通過(guò):強(qiáng)制轉(zhuǎn)換成 BitmapDrawable

?* Bitmap bitmap = ((BitmapDrawable)xxx).getBitmap();

?*/

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容