IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Bitmap四个角不等的圆角切割 -> 正文阅读

[移动开发]Android Bitmap四个角不等的圆角切割

1. 问题背景

设计的需要是这样的:需要上边两个角圆角,下边两个角是直角,同时这张图是Url Glide加载进来的。OK,目标明确,做起来也不是很难了。
在这里插入图片描述

2. 解决方案

  1. 首先加载 Url 图片进来
Glide.with(this).load(url).into(new CustomTarget<Drawable>() {
	@Override
	public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
		// 这个是下载下来的原图片,我们需要把他切一下圆角
	    Bitmap source = ((BitmapDrawable) resource).getBitmap();
	    imageView.setImageBitmap(getRoundBitmap(source
	                , ltCornerSize, rtCornerSize, rbCornerSize, lbCornerSize));
	}
	
	@Override
	public void onLoadCleared(@Nullable Drawable placeholder) {
	
	}
});
  1. getRoundBitmap 方法实现,这里我们是用 Canvas + Paint + Path 来绘制的,Code 如下:

    /**
     * 为 Bitmap 设置切割圆角
     *
     * @param source 原图片
     * @param lt     左上圆角 px
     * @param rt     右上圆角 px
     * @param rb     右下圆角 px
     * @param lb     左下圆角 px
     * @return 按照参数切割圆角后的 Bitmap
     */
    public static Bitmap getRoundBitmap(Bitmap source, float lt, float rt, float rb, float lb) {
        Bitmap result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        // 设置画笔为原图
        paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        float width = source.getWidth(), height = source.getHeight();
        // 绘制四个圆角,只四个圆角的话,结果如图1
        canvas.drawArc(new RectF(0, 0, lt, lt), 180, 90, true, paint);
        canvas.drawArc(new RectF(width - rt, 0, width, rt), 270, 90, true, paint);
        canvas.drawArc(new RectF(width - rb, height - rb, width, height), 0, 90, true, paint);
        canvas.drawArc(new RectF(0, height - lb, lb, height), 90, 90, true, paint);
        // 绘制剩余区域
        // 因为上边是圆角,我们只绘制了一个半径,所以除2就是剩余要绘制的区域了
        // 不除2的话,结果如图2
        lt /= 2;
        rt /= 2;
        rb /= 2;
        lb /= 2;
        Path path = new Path();
        path.moveTo(0, lt);
        path.moveTo(lt, lt);
        path.moveTo(lt, 0);
        path.lineTo(width - rt, 0);
        path.lineTo(width - rt, rt);
        path.lineTo(width, rt);
        path.lineTo(width, height - rb);
        path.lineTo(width - rb, height - rb);
        path.lineTo(width - rb, height);
        path.lineTo(lb, height);
        path.lineTo(lb, height - lb);
        path.lineTo(0, height - lb);
        path.lineTo(0, lt);
        path.close();
        canvas.drawPath(path, paint);
        return result;
    }

例图1
图一
例图2,乱七八糟……
图2

3. End

最终的结果是这样事儿的:
结果
OK 修改一下参数,交工!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:49:12  更:2021-08-18 12:50:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:16:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码