Android 使用 Canvas 和 Paint 实现圆角图片

学习笔记

效果展示:

全部代码:

public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding = ActivityYuanBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 设置返回按钮的点击事件,点击时跳转到 MainActivitybinding.fanhuiYuan.setOnClickListener(v -> {Intent intent = new Intent(YuanActivity.this, MainActivity.class);startActivity(intent);});// 加载原始图片(从资源文件加载)Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.userphoto);// 获取圆形裁剪后的图片,这里 500 是圆角的半径Bitmap roundedBitmap = getRoundedCornerBitmap(bitmap, 500);// 设置 ImageView 显示圆形裁剪后的图片binding.yuanjiaophotoYuan.setImageBitmap(roundedBitmap);}/*** 将原始 Bitmap 转换为圆角图片(这里实际是圆形图片)** @param bitmap 原始图片* @param radius 圆角半径* @return 圆角(圆形)图片*/private Bitmap getRoundedCornerBitmap(Bitmap bitmap, float radius) {// 获取原始图片的宽高int width = bitmap.getWidth();int height = bitmap.getHeight();// 创建一个新的 Bitmap,用于保存圆角效果的图像// 使用 ARGB_8888 配置,支持透明度,效果较好Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个 Canvas 对象,用于在新 Bitmap 上绘制Canvas canvas = new Canvas(output);// 创建 Paint 对象,设置绘制样式Paint paint = new Paint();paint.setAntiAlias(true); // 启用抗锯齿,以确保绘制出来的圆角平滑paint.setFilterBitmap(true); // 启用图像过滤,提高图像质量paint.setDither(true); // 启用抖动,使图像颜色更平滑paint.setColor(Color.BLACK); // 设置画笔颜色为黑色// 创建一个矩形区域,作为圆角矩形的边界RectF rectF = new RectF(0, 0, width, height);// 绘制一个圆角矩形(实际绘制的是一个圆形矩形)// 这里的 radius 就是圆角的半径,设置为较大的值会形成圆形效果canvas.drawRoundRect(rectF, radius, radius, paint);// 设置 Xfermode(混合模式),使得图片绘制在圆角矩形内// SRC_IN 表示仅保留矩形与原图片交集部分的内容,超出部分透明paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));// 将原始图片绘制到圆角矩形区域内canvas.drawBitmap(bitmap, 0, 0, paint);// 返回处理后的圆角图片return output;}
}

学习笔记:使用 CanvasPaint 实现圆角图片

在 Android 中,CanvasPaint 是用于图形绘制的基础类,利用这两者可以对图片进行各种裁剪和样式处理。实现圆角图片的关键是对原始图片进行裁剪,使其边角变圆。通过绘制一个圆角矩形,将图片内容限制在这个矩形内,即可实现圆角效果。

基本概念
  • Canvas:用于绘制图形的画布,可以用来绘制矩形、圆形、图片等内容。
  • Paint:控制绘制的样式,包括颜色、线条宽度、抗锯齿等。
  • Bitmap:位图对象,表示图片的数据,可以对其进行操作(例如裁剪、旋转等)。

步骤说明:实现圆角图片

1. 创建新的 Bitmap

为了将原图裁剪为圆角图像,首先需要创建一个新的 Bitmap,它的宽度和高度与原图相同,并且格式为 ARGB_8888,以保证图片质量。

2. 绘制圆角矩形

使用 CanvasPaint 绘制一个圆角矩形。圆角的半径通过传入的参数来控制,矩形的大小与原始图片相同。

3. 使用 Xfermode 实现图像裁剪

Xfermode 控制图形的混合模式。在这里,使用 PorterDuff.Mode.SRC_IN 可以确保图片只绘制在圆角矩形区域内,其他部分会变成透明。

4. 将原始图片绘制到圆角区域

最后,我们将原始图片绘制到上面创建的圆角矩形区域,从而实现圆角效果。


代码实现:

 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = findViewById(R.id.imageView);// 加载原始图片Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);// 获取圆角裁剪后的图片Bitmap roundedBitmap = getRoundedCornerBitmap(bitmap, 30); // 30是圆角的半径// 显示圆角图片imageView.setImageBitmap(roundedBitmap);}/*** 将 Bitmap 转换为圆角图片** @param bitmap 原始图片* @param radius 圆角半径* @return 圆角图片*/private Bitmap getRoundedCornerBitmap(Bitmap bitmap, float radius) {// 获取图片的宽高int width = bitmap.getWidth();int height = bitmap.getHeight();// 创建一个新的 Bitmap,用于保存圆角效果Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个 Canvas 用来绘制圆角图像Canvas canvas = new Canvas(output);// 创建一个 Paint 对象Paint paint = new Paint();paint.setAntiAlias(true); // 抗锯齿paint.setFilterBitmap(true); // 使用过滤器paint.setDither(true); // 使用抖动paint.setColor(Color.BLACK); // 设置画笔颜色为黑色// 创建一个矩形,作为圆角矩形的边界RectF rectF = new RectF(0, 0, width, height);// 绘制圆角矩形canvas.drawRoundRect(rectF, radius, radius, paint);// 设置 Xfermode 使图像绘制在圆角矩形区域内paint.setXfermode(new android.graphics.PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));// 绘制原始图片canvas.drawBitmap(bitmap, 0, 0, paint);return output;}
}

代码分析:

  1. 加载原图

     
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);
    

  2. 创建一个新的 Bitmap 用于绘制

     
    Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    

  3. 创建 Canvas 和 Paint 对象

     
    Canvas canvas = new Canvas(output);
    Paint paint = new Paint();
    paint.setAntiAlias(true); // 启用抗锯齿
    paint.setColor(Color.BLACK); // 设置画笔颜色
    

    Canvas 用于在 output 图像上绘制内容,Paint 设置绘制的风格。

  4. 绘制圆角矩形

     
    RectF rectF = new RectF(0, 0, width, height);
    canvas.drawRoundRect(rectF, radius, radius, paint);
    

    使用 drawRoundRect 方法绘制一个圆角矩形,radius 控制圆角的半径。

  5. 设置 Xfermode

     
    paint.setXfermode(new android.graphics.PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));
    

    设置 Xfermode,只让图像在圆角矩形内显示。SRC_IN 模式会保留原始图像和绘制区域的交集部分。

  6. 绘制原图像

     
    canvas.drawBitmap(bitmap, 0, 0, paint);
    

    将原图绘制到新的图像区域。


圆角半径控制:

  • radius 参数控制圆角的半径。较小的 radius 适合轻微的圆角效果,而较大的 radius 会让图像角落更加圆润。

总结:

  • 使用 CanvasPaint 来绘制圆角图片的主要思路是:首先绘制一个圆角矩形,然后将原图绘制到矩形区域中,通过 Xfermode 保证只显示矩形区域的部分,从而达到圆角效果。
  • 这种方法适用于简单的圆角效果,但如果你需要更复杂的图片处理(例如圆形裁剪、圆角加阴影等),可以进一步扩展使用。

复习要点:

  1. Canvas:绘制图形的工具。
  2. Paint:控制图形绘制样式(例如颜色、抗锯齿等)。
  3. Xfermode:控制图形绘制的混合模式。
  4. PorterDuff.Mode.SRC_IN:绘制交集部分的模式,常用于裁剪图像。
  5. 圆角半径控制:根据需求调整圆角效果的大小。

通过这篇笔记,可以更好地理解如何通过 Android 的绘图工具来实现常见的图像效果,如圆角图片裁剪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487227.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android SurfaceFlinger layer层级

壁纸作为显示的最底层窗口它是怎么显示的 1. SurfaceFlinger layer层级 锁屏状态dump SurfaceFlinger ,adb shell dumpsys SurfaceFlinger Display 0 (active) HWC layers: -----------------------------------------------------------------------------------…

【机器学习】机器学习的基本分类-监督学习-Lasso 回归(Least Absolute Shrinkage and Selection Operator)

Lasso 回归是一种线性回归方法,通过引入 ​ 正则化(绝对值惩罚项)约束回归系数,既能解决多重共线性问题,又具有特征选择能力。 1. Lasso 回归的目标函数 Lasso 的目标是最小化以下损失函数: 其中&#xff…

如何防御ARP欺骗 保护IP安全

在数字化浪潮席卷全球的今天,网络安全威胁如同暗流涌动,时刻考验着我们的防范能力。其中,ARP欺骗攻击作为一种隐蔽性强、成本低廉且危害严重的网络攻击手段,成为众多网络安全事件中的一颗“毒瘤”。那么我们究竟是如何防御ARP欺骗…

子网划分实例

看到有人问这个问题: 想了一下,这是一个子网划分的问题: 处理方法如图: 这是一个子网划分的问题 设备1用三层交换机,端口设置为路由模式,设备2和设备3为傻瓜交换机模式 设备2和设备3下挂设备都是26为掩码&…

消息中间件-Kafka3-kafkaJavaClient小例

消息中间件-Kafka3-kafkaJavaClient小例 Kafak Java Client private static final String KAFKA_TOPIC "kafak-test";private static String bootstrapServers "localhost:9092";private static AdminClient client null;static {Properties config n…

怎么获取Java高并发经验与系统设计技能?

如何获得高并发经验? 这是系统邀请我回答的一个问题,由此也引发了我的一些思考:为什么人人都想要获得高并发经验;想拥有高并发系统设计技能? 其原因LZ认为主要有以下三点: 涨薪:有高并发系统设…

【Java】类似王者荣耀游戏

r77683962/WangZheYouDianRongYao 运行效果图: 类似王者荣耀游戏运行效果图_哔哩哔哩_bilibili

HTML Input 文件上传功能全解析:从基础到优化

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意:该项目只展示部分功能,如需了解,文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…

生活大爆炸版石头剪刀布(洛谷P1328)

生活大爆炸版石头剪刀布(洛谷P1328) [NOIP2014 提高组] 前言: 由于洛谷发布题解有限制,所以在CSDN上发布洛谷题解。 所有题解均是Java语言, 但是思路是相同的 每篇都是刷题日常,尽量讲清楚算法逻辑。 希望有问题还请大佬们指导! …

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…

【CKA】Kubernetes(k8s)认证之CKA考题讲解

CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全&#xff0c;要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名&#xff1a; al…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

PHP语法学习(第六天)-条件语句,关联数组

&#x1f4a1;依照惯例&#xff0c;回顾一下昨天讲的内容 PHP语法学习(第五天)主要讲了PHP中的常量和运算符的运用。 &#x1f525; 想要学习更多PHP语法相关内容点击“PHP专栏” 今天给大家讲课的角色是&#x1f34d;菠萝吹雪&#xff0c;“我菠萝吹雪吹的不是雪&#xff0c;而…

java中的数组(2)

大家好&#xff0c;我们今天继续来看java中数组这方面的知识点&#xff0c;那么话不多说&#xff0c;我们直接开始。 一.数组的使用 1.数组中元素访问 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,数组可以通过下标访问其任意位置的元素. 也可以进行修改…

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…

计算机网络安全 —— 实体鉴别与生成大随机数

一、实体鉴别# ​ 实体鉴别&#xff08;经常简称为鉴别&#xff09;就是一方验证另一方身份的技术。一个实体可以是人、客户/服务器进程等。这里仅讨论如何鉴别通信对端 实体的身份&#xff0c;即验证正在通信的对方确实是所认为的通信实体&#xff0c;而不是其他的假冒者。进…

【SpringBug】lombok插件中@Data不能生成get和set方法

一&#xff1a;问题引入 可以看到我们在类UserInfo上写了Data注解&#xff0c;但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法 二&#xff1a;解决方法 1&#xff1a;Spring升级问题&#xff08;解决了我的问题&#xff09; 原因是Spring官方进行了升级…

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题&#xff1a; Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败&#xff1a; 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…