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

yizhihongxing

下面我将详细讲解“Android将Glide动态加载不同大小的图片切圆角与圆形的方法”的完整攻略。

何为Glide

Glide是一个用于在Android中加载图像、视频以及gif动画等媒体资源的快速轻量级库。Glide库使用简单,可缩短开发时间并有效地减少Out Of Memory异常的发生。同时,Glide操作图片的速度比Picasso或Fresco要慢,且支持纹理压缩、解码WebP格式、图片变换、动画、磁盘缓存等。

在Glide中实现圆角与圆形图片

原理

从本质上讲,Glide需要将加载的图片裁剪为圆角或圆形。为了实现这一点,我们需要借助于Glide的一个功能——Transformation。此类用于转换 Bitmap 数据以供 Glide 使用。它是一种可组合的转换,即可以对 Bitmap 进行一系列转换操作后,又可进行变换、加载到 View 中。我们可以通过实现Transformation来实现图片的圆角或圆形裁剪。

实现步骤

步骤一:引入Glide库

在build.gradle文件中添加以下代码,引入Glide库:

    dependencies {
        implementation 'com.github.bumptech.glide:glide:4.11.0'
    }

步骤二:自定义Transformation

自定义Transformation需要实现com.bumptech.glide.load.resource.bitmap.Transformation接口。这个接口只有一个方法transform(Bitmap source, int outWidth, int outHeight),用于对图片进行变换,返回一个新的Bitmap。

我们需要在transform()方法中完成图片的圆角或圆形处理操作,然后返回处理后的Bitmap。代码示例如下:

public class RoundTransformation implements Transformation<Bitmap> {
    private static final String ID = "com.example.app.RoundTransformation";
    private static final byte[] ID_BYTES = ID.getBytes(Charset.forName("UTF-8"));
    private float radius;
    private boolean isCircle;

    public RoundTransformation(float radius, boolean isCircle) {
        this.radius = radius;
        this.isCircle = isCircle;
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();
        Bitmap bitmap;
        if (isCircle) {
            bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            int minSize = Math.min(source.getWidth(), source.getHeight());
            canvas.drawCircle(minSize / 2f, minSize / 2f, minSize / 2f, paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(source, 0, 0, paint);
            if (source != bitmap) {
                source.recycle();
            }
        } else {
            bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
            canvas.drawRoundRect(rectF, radius, radius, paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(source, 0, 0, paint);
            if (source != bitmap) {
                source.recycle();
            }
        }
        return Resource.obtain(bitmap, Glide.get(context).getBitmapPool());
    }

    @Override
    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
    }
}

步骤三:使用自定义Transformation

完成自定义Transformation后,我们可以使用它将Glide加载的图片裁剪为圆角或圆形,代码示例如下:

Glide.with(context)
    .load(url)
    .apply(RequestOptions.bitmapTransform(new RoundTransformation(radius, isCircle)))
    .into(imageView);

这里我们将自定义Transformation传递给RequestOptions.bitmapTransform()方法即可进行参数的设置和图片的加载,在加载时即可实现圆角或圆形裁剪。

示例

示例一:加载圆形图片

以下代码将通过自定义的RoundTransformation来加载一张圆形的图片。

Glide.with(context)
    .load(url)
    .apply(RequestOptions.bitmapTransform(new RoundTransformation(-1, true)))
    .into(imageView);

这里我们将圆角半径设置为-1(即表示不需要圆角)并将isCircle设置为true,实现了圆形的裁剪。

示例二:加载圆角图片

以下代码将通过自定义的RoundTransformation来加载一张圆角的图片,圆角半径为40。

Glide.with(context)
    .load(url)
    .apply(RequestOptions.bitmapTransform(new RoundTransformation(40, false)))
    .into(imageView);

这里我们将圆角半径设置为40,并将isCircle设置为false,实现了圆角的裁剪。

总结

以上就是如何使用Glide实现圆角和圆形图片的方法,主要包括引入Glide库、自定义Transformation和使用自定义Transformation三个步骤。其中自定义Transformation是关键部分,我们需要在其中完成图片的圆角或圆形裁剪操作,并将新的Bitmap返回。另外,通过两个示例代码也能让我们更好地理解该方法的具体实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android将Glide动态加载不同大小的图片切圆角与圆形的方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • matlab保存图片的几种方式

    下面是 MATLAB 保存图片的几种方式的完整攻略。 1. 直接复制到剪贴板 首先,你可以通过直接复制到剪贴板的方式来保存 MATLAB 图片。只需要将图片右键点击复制即可,如下所示: % 创建一个二维数组并绘制图像 x = 0:pi/100:2*pi; y = sin(x); plot(x,y); % 将图像复制到剪贴板 copyobj(gca,f); p…

    其他 2023年4月16日
    00
  • 10分钟搞定让你困惑的 Jenkins 环境变量过程详解

    下面是“10分钟搞定让你困惑的 Jenkins 环境变量过程详解”的完整攻略。 什么是 Jenkins 环境变量? 在 Jenkins 中,环境变量代表着许多有用的信息,如构建号,构建时间等。使用环境变量可以帮助您更方便地编写构建脚本。 Jenkins 环境变量的使用 Jenkins 环境变量是由插件“EnvInject”提供支持,安装并启用此插件即可使用。…

    other 2023年6月27日
    00
  • D3.js的基础部分之数组的处理数组的排序和求值(v3版本)

    D3.js的基础部分之数组的处理数组的排序和求值(v3版本) 在D3.js中,处理数组是非常常见的需求。本文将介绍如何使用D3.js的v3版本对数组进行排序和求值。 排序 D3.js提供了d3.ascending和d3.descending方法来排序数组。这两个方法都可以用于排序数字、日期和字符串。 d3.ascending d3.ascending方法用于…

    other 2023年6月25日
    00
  • C++对string进行大小写转换操作方法

    当使用C++编程语言时,可以使用以下方法对字符串进行大小写转换操作: 使用标准库函数std::transform:这个函数可以将字符串中的每个字符应用一个转换函数,并将结果存储在另一个容器中。对于大小写转换,可以使用std::toupper和std::tolower函数。下面是一个示例代码: #include <iostream> #includ…

    other 2023年8月16日
    00
  • MATLAB 的函数

    MATLAB 的函数的完整攻略 MATLAB是一种高级技术计算语言和交互式环境,广泛应用于科学、工程和金融等领域。在MATLAB中,函数是一种独立的程序单元,可以接收输入参数并返回输出结果。本文将为您提供MATLAB的函数的完整攻略,包括介绍、方法和两个示例说明。 介绍 MATLAB的函数是一种独立的程序单元,可以接收输入参数并返回输出结果。函数可以帮助用户…

    other 2023年5月6日
    00
  • Java与C++分别用递归实现汉诺塔详解

    Java与C++分别用递归实现汉诺塔详解 1. 理论背景 汉诺塔是一个经典的递归问题,它可以用于验证一个编程语言是否具备递归能力。 汉诺塔由三根针和若干个圆盘组成,每个圆盘有一个固有的大小,这些圆盘可以滑动到任意一根针上,但是每次只能移动一个圆盘并且大的圆盘不能放在小的圆盘上面。使用递归的方式可以让我们轻松找出三个针上的圆盘移动方法。 2. 递归实现 Jav…

    other 2023年6月27日
    00
  • C语言数据结构超详细讲解单向链表

    标题:C语言数据结构超详细讲解单向链表 简介 本文主要介绍C语言中的单向链表数据结构,包括单向链表的基本操作及其实现方式。学习本文需要读者已经掌握C语言基础知识。 单向链表概述 单向链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含两个部分:数据部分和指向下一个节点的指针。最后一个节点的指针为空指针,即指向NULL。单向链表的头节点没有数据,只有…

    other 2023年6月26日
    00
  • 苹果iOS9.3.3 Beta1开发者预览版(13G12)发布 修复bug

    苹果iOS9.3.3 Beta1开发者预览版(13G12)发布 修复bug攻略 什么是iOS9.3.3 Beta1开发者预览版(13G12)? iOS9.3.3 Beta1开发者预览版(13G12)是Apple发布的测试版本,专为开发者开发和测试使用,目的在于对iOS进一步完善和优化,并修复一些bug。 如何获取iOS9.3.3 Beta1开发者预览版(13…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部