`
龙哥IT
  • 浏览: 258291 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Glide设置圆角或者圆形图片

 
阅读更多

第一个方法是通过在外层添加一个CardView

            <android.support.v7.widget.CardView
                android:id="@+id/cardview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                app:cardBackgroundColor="@color/C2_5"
                app:cardCornerRadius="10dp"
                app:cardElevation="0dp"
                app:contentPadding="0.5dp">

                <ImageView
                    android:id="@+id/food_img"
                    android:layout_width="85dp"
                    android:layout_height="85dp"
                    android:scaleType="centerCrop"
                    android:src="@drawable/noinfo_big" />
            </android.support.v7.widget.CardView>

 

但是如果要在图片外层加一个带颜色的边框该如何处理呢,这样的话,第一种方法就用不成了,圆角会很难看,那么就需要用到第二种自定义

package XXX.view;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader.TileMode;
import android.support.annotation.NonNull;

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;

import java.security.MessageDigest;

/**
 * 集圆角/圆形/蒙层一体
 */
public class GlideCircleTransform implements Transformation<Bitmap> {
    private BitmapPool mBitmapPool;
    private  int coverColor = -1;
    private float radius;
    private boolean exceptLeftTop, exceptRightTop, exceptLeftBottom, exceptRightBotoom;
    /**
     * 除了那几个角不需要圆角的
     *
     * @param leftTop
     * @param rightTop
     * @param leftBottom
     * @param rightBottom
     */
    public void setExceptCorner(boolean leftTop, boolean rightTop, boolean leftBottom, boolean rightBottom) {
        this.exceptLeftTop = leftTop;
        this.exceptRightTop = rightTop;
        this.exceptLeftBottom = leftBottom;
        this.exceptRightBotoom = rightBottom;
    }
    public GlideCircleTransform(Context context) {
        this(Glide.get(context).getBitmapPool());
    }

    public GlideCircleTransform(Context context, int coverColor) {
        this(Glide.get(context).getBitmapPool());
        this.coverColor = coverColor;
    }

    public GlideCircleTransform(Context context, int coverColor, float radius) {
        this(Glide.get(context).getBitmapPool());
        this.radius = radius;
        this.coverColor = coverColor;
    }

    public GlideCircleTransform(BitmapPool pool) {
        this.radius = 0.0F;
        this.mBitmapPool = pool;
    }

    public Resource<Bitmap> transform(Context context,Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = (Bitmap)resource.get();
        Bitmap bitmap = null;
        int width;
        int height;
        int afterWidth;
        if(this.radius > 0.0F) { //设置圆角
            int afterHeight;
            float bili;
            float bili1;
            if(outWidth > outHeight) {
                bili = (float)outHeight / (float)outWidth;
                afterWidth = source.getWidth();
                afterHeight = (int)((float)source.getWidth() * bili);
                if(afterHeight > source.getHeight()) {
                    bili1 = (float)outWidth / (float)outHeight;
                    afterHeight = source.getHeight();
                    afterWidth = (int)((float)source.getHeight() * bili1);
                }
            } else if(outWidth < outHeight) {
                bili = (float)outWidth / (float)outHeight;
                afterHeight = source.getHeight();
                afterWidth = (int)((float)source.getHeight() * bili);
                if(afterWidth > source.getWidth()) {
                    bili1 = (float)outHeight / (float)outWidth;
                    afterWidth = source.getWidth();
                    afterHeight = (int)((float)source.getWidth() * bili1);
                }
            } else {
                afterHeight = source.getHeight();
                afterWidth = afterHeight;
            }
            width = (source.getWidth() - afterWidth) / 2;
            height = (source.getHeight() - afterHeight) / 2;
            //修正圆角
            this.radius *= (float)afterHeight / (float)outHeight;
            bitmap = this.mBitmapPool.get(afterWidth, afterHeight, Config.ARGB_8888);
            if(bitmap == null) {
                bitmap = Bitmap.createBitmap(afterWidth, afterHeight, Config.ARGB_8888);
            }

            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            BitmapShader shader = new BitmapShader(source, TileMode.CLAMP, TileMode.CLAMP);
            if(width != 0 || height != 0) {
                Matrix matrix = new Matrix();
                matrix.setTranslate((float)(-width), (float)(-height));
                shader.setLocalMatrix(matrix);
            }

            paint.setShader(shader);
            paint.setAntiAlias(true);
            RectF rectF = new RectF(0.0F, 0.0F, (float)canvas.getWidth(), (float)canvas.getHeight());
            canvas.drawRoundRect(rectF, this.radius, this.radius, paint);

            //设置蒙层
            Paint coverPaint = new Paint();
            coverPaint.setAntiAlias(true);
            coverPaint.setColor(coverColor);
            if(coverColor > -1) {
                canvas.drawRoundRect(rectF, this.radius, this.radius, coverPaint);
            }


            if (exceptLeftTop) { //左上角不为圆角
                canvas.drawRect(0, 0, radius, radius, paint);
                if (coverColor > -1) {
                    canvas.drawRect(0, 0, radius, radius, coverPaint);
                }
            }
            if (exceptRightTop) {//右上角不为圆角
                canvas.drawRect(canvas.getWidth() - radius, 0, canvas.getWidth(), radius, paint);
                if (coverColor > -1) {
                    canvas.drawRect(canvas.getWidth() - radius, 0, canvas.getWidth(), radius, coverPaint);
                }
            }

            if (exceptLeftBottom) {//左下角不为圆角
                canvas.drawRect(0, canvas.getHeight() - radius, radius, canvas.getHeight(), paint);
                if (coverColor > -1) {
                    canvas.drawRect(0, canvas.getHeight() - radius, radius, canvas.getHeight(), coverPaint);
                }
            }

            if (exceptRightBotoom) {//右下角不为圆角
                canvas.drawRect(canvas.getWidth() - radius, canvas.getHeight() - radius, canvas.getWidth(), canvas.getHeight(), paint);
                if (coverColor > -1) {
                    canvas.drawRect(canvas.getWidth() - radius, canvas.getHeight() - radius, canvas.getWidth(), canvas.getHeight(), coverPaint);
                }
            }



        } else { //设置圆形
            width = Math.min(source.getWidth(), source.getHeight());
            height = (source.getWidth() - width) / 2;
            afterWidth = (source.getHeight() - width) / 2;
            bitmap = this.mBitmapPool.get(width, width, Config.ARGB_8888);
            if(bitmap == null) {
                bitmap = Bitmap.createBitmap(width, width, Config.ARGB_8888);
            }

            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            BitmapShader shader = new BitmapShader(source, TileMode.CLAMP, TileMode.CLAMP);
            if(height != 0 || afterWidth != 0) {
                Matrix matrix = new Matrix();
                matrix.setTranslate((float)(-height), (float)(-afterWidth));
                shader.setLocalMatrix(matrix);
            }

            paint.setShader(shader);
            paint.setAntiAlias(true);
            float r = (float)width / 2.0F;
            canvas.drawCircle(r, r, r, paint);
            //设置蒙层
            if(coverColor != -1) {
                Paint paint1 = new Paint();
                paint1.setAntiAlias(true);
                paint1.setColor(coverColor);
                canvas.drawCircle(r, r, r, paint1);
            }
        }

        return BitmapResource.obtain(bitmap, this.mBitmapPool);
    }

    public String getId() {
        return this.getClass().getName();
    }

    @Override
    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

    }
}

 

然后在需要转换的imageview的地方调用

  RequestOptions options = new RequestOptions().transform(new GlideCircleTransform(mContext,mContext.getResources().getColor(R.color.C2_5),20));
                Glide.with(mContext).load(item.getImage()).apply(options).into((ImageView) helper.getView(R.id.imageview));

 这样就完美处理了

 

分享到:
评论

相关推荐

    Glide加载圆形图片 自定义圆角 和对指定角加载圆角

    默认情况下,Glide并不支持直接加载为圆形图片,但我们可以创建一个自定义的`BitmapTransformation`类来实现这个功能。创建一个名为`CircleTransform`的类,继承自`BitmapTransformation`,并重写`transform`方法。...

    Glide加载圆形图片和自定义圆角图片

    本篇文章将深入探讨如何使用Glide实现圆形图片和自定义圆角图片的加载。 首先,我们要了解Glide的基本用法。Glide是Square公司开发的一款Android图片加载库,它支持多种图片格式,包括网络图片和本地资源。基本的...

    Android中Glide加载圆形图片和圆角图片实例代码

    介绍两种使用 BitmapTransformation 来实现 Glide 加载圆形图片和圆角图片的方法。Glide 并不能直接支持 Round Pictures ,需要使用 BitmapTransformation 来进行处理。 二、网上的实现方式 这里介绍下网上常见的...

    火山安卓圆角和圆形图片框,rar

    "火山安卓圆角和圆形图片框"是这个框架中的一个特性,用于实现图片显示时的圆角效果和完全圆形的图片框。在本源码中,开发者可以深入理解火山安卓如何实现这一功能,以及它的工作原理。 首先,让我们来看看"圆角...

    glide加载圆角.zip

    例如,你可以使用` RequestOptions.circleCrop()`方法直接将图片裁剪成圆形,或者使用` RequestOptions.roundCrop()`方法将图片四角都变为相同的圆角。 总的来说,Glide的强大之处在于其灵活性和可扩展性。通过...

    圆角图片,圆形图片,椭圆图片

    圆形图片的实现与圆角图片类似,只需在`getRoundedCornerBitmap()`方法中创建一个完全圆形的Bitmap。可以将`drawRoundRect()`替换为`drawCircle()`,并确保宽度和高度相等。 3. **椭圆图片** 椭圆图片的实现则...

    圆角和圆形ImageView_RoundBitmap

    除了手动实现,Android开发者还可以利用第三方库,如`Glide`或`Picasso`,这些库提供了方便的API来实现圆角或圆形图片的加载和显示。例如,`Glide`可以使用`.transform(CircleTransform)`来轻松地将图片转换为圆形...

    Android设置图片圆角的方法

    Android中经常会遇到对图片进行二次处理,例如加圆角,或者显示圆形图片 实现的效果图: 方法一: 通过第三方框架Glide实现图片显示有圆角,有三种写法如下: 1.1、第一种实现: RequestOptions options = new ...

    Android将Glide动态加载不同大小的图片切圆角与圆形的方法

    7. **切圆角或圆形图片**: - 创建自定义Glide的转换类,例如`CircleTransform`: ```java public class CircleTransform extends BitmapTransformation { public CircleTransform(Context context) { super...

    Android 各种图像转换(圆角/圆形/五角星)的转换库 源码

    在Android开发中,对图像进行各种形状的转换是常见的需求,比如制作圆角图片、圆形图片甚至是五角星等特殊形状。"glide-transformations"是一个强大的库,它为Glide——一个流行的Android图片加载库——提供了丰富的...

    android ImageView网络图片加载、动态设置尺寸、圆角(绝对好用)

    在实际应用中,我们不仅需要显示本地资源中的图像,还经常需要从网络上加载图片,同时可能还需要根据界面需求动态设置ImageView的尺寸以及实现圆角效果。下面将详细讲解这些知识点。 1. **网络图片加载** Android...

    Android-一个Kotlin实现的简单小巧支持圆形和圆角定制化的ImageView

    例如,可以设置`cornerRadius`属性来实现圆角效果,或者直接将`shape`属性设置为`Circle`来创建圆形图片。此外,可能还支持其他高级特性,比如边框宽度和颜色,以及是否保持宽高比等,使得图片视图的定制更加灵活。 ...

    android ImageView动态设置尺寸、圆角(绝对好用)

    综上所述,Android中的ImageView是一个强大的组件,可以通过编程方式动态设置其尺寸和实现圆角效果,同时利用第三方库如Glide轻松加载网络图片。这些技术的应用,能帮助开发者实现更加丰富和个性化的UI设计。

    Glide动态加载图片

    Glide动态加载图片(transform方法不识别问题) ...(1)Glide加载图片(圆角、圆形等)采用Glide3.6.1 (2)Github上资源关于解决4.0以上Glide的参考Demo 可以参考个人博客“关于Android加载图片的问题”,有详细讲解

    安卓头像制作图片圆角剪裁相关-圆形图片的实现.rar

    "安卓头像制作图片圆角剪裁相关-圆形图片的实现.rar"这个压缩包提供了一些资源和代码示例,帮助开发者实现这一功能。尽管其中的代码可能需要根据具体情况进行调整才能运行,但它们提供了宝贵的参考价值。 首先,...

    详解Android中Glide与CircleImageView加载圆形图片的问题

    这个问题的原因在于CircleImageView可能在Glide加载图片前就已经设置了默认的圆形图片,导致Glide加载的网络图片无法正常覆盖。 以下是四种解决方法: 1. **不使用占位符**: 可以选择注释掉Glide加载时的`....

    java_android_Glide图片加载工具类的标准代码_图片转圆形 图片模糊等

    Google推荐的图片加载库,专注于流畅的滚动 Glide 比Picasso 加载快 但需要更大的内存来缓存 Glide 不光接受Context,还接受Activity 和 Fragment ,...加载设置圆形图片 旋转 图片转圆形 图片模糊 图片转换圆角图片

    android 圆角图片+图片倒影

    BitmapShader是一个用于在位图上应用着色器的类,它允许我们将图片渲染为不同形状,例如圆形或圆角矩形。以下是一个创建圆角图片的基本步骤: 1. 创建一个Bitmap对象,加载你要处理的图片。 2. 创建一个Shader对象...

    android图片圆角处理

    在Android开发中,图片圆角处理是一个常见的需求,特别是在设计用户界面时,为了追求美观和专业,圆形或者带有圆角的图像元素往往被广泛应用。本文将深入探讨如何在Android平台上实现图片的圆角处理。 首先,我们...

Global site tag (gtag.js) - Google Analytics