Android经典实战之Kotlin中实现圆角图片和圆形图片

news2024/9/23 11:17:37

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

实现圆角是一个很常见的需求,也有很多种方式,这里介绍2种,实现起来都不麻烦,很方便

方法一:自定义View

在 Kotlin 中实现圆角的 AppCompatImageView 可以通过自定义控件和使用 CanvasPath 进行剪裁来实现。下面是一个简单的实现方法,继承 AppCompatImageView 并自定义绘制方法,使其可以设置圆角属性。

自定义 AppCompatImageView

首先,创建一个自定义的 AppCompatImageView 类:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Path
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import kotlin.math.min

class RoundedImageView @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {

    private val path = Path()
    private var cornerRadius = 0f

    init {
        // 初始化代码,可以在此读取自定义属性
    }

    override fun onDraw(canvas: Canvas) {
        val rect = canvas.clipBounds
        val radius = min(rect.width(), rect.height()) / 2f
        path.addRoundRect(
            rect.left.toFloat(), rect.top.toFloat(), rect.right.toFloat(), rect.bottom.toFloat(),
            floatArrayOf(cornerRadius, cornerRadius, cornerRadius, cornerRadius, 
                         cornerRadius, cornerRadius, cornerRadius, cornerRadius), 
            Path.Direction.CW
        )
        canvas.clipPath(path)
        super.onDraw(canvas)
    }

    // 设置圆角半径
    fun setCornerRadius(radius: Float) {
        cornerRadius = radius
        invalidate()
    }
}

在布局文件中使用自定义的 ImageView

在 XML 布局文件中使用自定义的 RoundedImageView

<com.example.yourpackage.RoundedImageView
    android:id="@+id/rounded_image_view"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:scaleType="centerCrop"
    android:src="@drawable/your_image"
    />

在代码中动态设置圆角

最后,在代码中动态设置圆角:

val roundedImageView = findViewById<RoundedImageView>(R.id.rounded_image_view)
roundedImageView.setCornerRadius(30f) // 设置圆角半径为30像素

完整实现

将这个方案分成两个主要部分:

1、 创建一个自定义的 RoundedImageView 类,并在 onDraw 方法中重写绘制逻辑。
2、 使用自定义的 RoundedImageView 并动态设置圆角。

通过这种方式,可以实现一个自定义的 AppCompatImageView,能够根据需要动态调整圆角半径。同时,也可以进一步扩展这个自定义控件,例如支持设置不同角的圆角半径,这取决于实际的需求和设计要求。

方法二:ShapeableImageView

另一个常用的方法是使用 ShapeableImageView 以及 material 库提供的功能,它提供了一些方便的属性来实现圆角效果。

使用 ShapeableImageView

ShapeableImageView 是 Android Material 库的一部分,可以非常方便地实现圆角和其他形状效果。

添加依赖

首先,在 build.gradle 文件中添加 Material 依赖:

dependencies {
    implementation 'com.google.android.material:material:1.9.0' // 确保使用最新版本
}
在布局文件中使用 ShapeableImageView

在 XML 布局文件中使用 ShapeableImageView 并设置圆角属性:

<com.google.android.material.imageview.ShapeableImageView
    android:id="@+id/rounded_image_view"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:scaleType="centerCrop"
    android:src="@drawable/your_image"
    app:shapeAppearanceOverlay="@style/RoundedImageViewStyle"/>
定义样式

res/values/styles.xml 中定义一个样式,用于设置 ShapeableImageView 的圆角:

<resources>
    <style name="RoundedImageViewStyle" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">16dp</item>
    </style>
</resources>
动态设置圆角半径

在代码中,你还可以动态地设置圆角半径:

import com.google.android.material.shape.CornerFamily
import com.google.android.material.imageview.ShapeableImageView

val roundedImageView = findViewById<ShapeableImageView>(R.id.rounded_image_view)
val shapeAppearanceModel = roundedImageView.shapeAppearanceModel.toBuilder()
    .setAllCorners(CornerFamily.ROUNDED, 30f) // 设置所有圆角半径为 30px
    .build()
roundedImageView.shapeAppearanceModel = shapeAppearanceModel

这种方法利用了 Material Design 提供的现成功能,可以更轻松地应用和管理圆角效果,而无需自己实现复杂的绘制逻辑。

完整实现

将这两个部分结合起来:

1、 在 build.gradle 中添加 Material 依赖。
2、 在布局文件中使用 ShapeableImageView 并设置初始的圆角样式。
3、 在代码中动态调整圆角半径。

这样,你可以获得一个易于管理且高度可控的圆角 ImageView,同时也利用了 Material Design 的强大功能。此外,ShapeableImageView 还支持其他形状和效果,可以根据需要进一步扩展。


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS+CSS案例:可适应上下布局和左右布局的菜单(含二级菜单)

今天,我给大家分享一个原创的CSS菜单,整个菜单全由CSS写成,仅在切换布局时使用JS。合不合意,先看看效果图。 本例图片 接下来,我来详细给大家分享它的制作方法。 文件夹结构 因为涉及到了样式表切换,所以,你需要借鉴一下我的文件夹结构。 CSS文件夹: reset.css 用于…

【Dash】Dash Layout

一、Dash Layout Dash apps are composed of two parts. The first part is the layout, which describes what the app looks like. The second part describes the interactivity of the app. To get started, create a file named app.py, copy the code below into it, a…

Linux权限-chmod命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 根据前面Linux用户介绍&#xff0c;里面涉及到超级管理员&#xff0c;普通用户&#xff0c;系统用户&#xff0c;既然用户有…

微信小程序-Vant组件库的使用

一. 在app.json里面删除style&#xff1a;v2 为了避免使用Vant组件库和微信小程序组件样式的相互影响 二.在app.json里面usingComponents注册Vant组件库的自定义组件 "usingComponents": {"van-icon": "./miniprogram_npm/vant-weapp/icon/index&qu…

Discourse 将主题打印成 PDF

Discourse 允许用户通过使用 打印主题&#xff08;Print topic&#xff09; 快捷键来生成 PDF 文件。这个快捷键针对操作系统的不同&#xff0c;可以通过键盘上的 ? 来进行查看。 大部分操作系统: ctrlpMacOS: ⌘p 使用快捷键后会打开一个新的浏览器窗口&#xff0c;在这个新…

【LeetCode每日一题】——653.两数之和 IV - 输入二叉搜索树

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 简单 三【题目编号】 653.两数之和 IV - 输入二叉搜索树 四【…

使用MAC电脑、iPhone 真机调试 H5页面

使用MAC电脑、iPhone 真机调试 H5页面 简介Safari 浏览器设置iPhone 手机设置开始调试 简介 为方便在 H5开发过程中在真实手机调试 H5页面&#xff0c;可进行一下设置 Safari 浏览器设置 在 Mac 电脑打开浏览器后&#xff0c;点左上角的" Safari 浏览器" -> “设…

Android OCR 谷歌OCR TextRecognition用法介绍

谷歌OCR TextRecognition用法介绍 文章目录 谷歌OCR TextRecognition用法介绍简介作用如何使用1 在project-build.gradle/setting.gradle添加maven仓库2.在module-build.gradle添加仓库依赖3.初始化4.使用InputImage5.进行识别 完整代码使用效果&#xff1a; 所有代码在Github-…

IEEE报告解读:存储技术发展趋势分析

1.引言 随着数据科学、物联网&#xff08;IoT&#xff09;和永久存储需求的快速增长&#xff0c;对大规模数据存储的需求正在迅速增加。存储技术的发展趋势直接关系到数据的可靠性和经济性。本文将根据IEEE最新发布的《2023年国际器件与系统路线图》&#xff0c;深入探讨各种存…

私网环境下如何使用云效流水线进行 CI/CD?

作者&#xff1a;怀虎 场景介绍 代码库、制品库等数据资产托管在内部办公网&#xff0c;公网不能访问&#xff0c;希望能够使用云效流水线进行 CICD 的编排和控制。 整体方案 云效流水线可以托管用户的私网环境内的机器&#xff0c;并将构建任务调度到这些机器上&#xff0…

PPT创作新纪元C-Ai PPT助手

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 解锁PPT创作新纪元 —— 遇见C-AiPPT助手 在这个快节奏的时代&#xff0c;无论是商务演示还是学术汇报&#xff0c;一份精美且内容丰富的PPT都是不可或缺的利器。但你是否曾为寻找合适的PPT…

81.SAP ME - SAP SMGW Getway Monitor

目录 1.起因 2.SMGW Displaying Logged On Clients Displaying Remote Gateways Display and Control Existing Connections Deleting a Connection Displaying Gateway Release Information Displaying Parameters and Attributes of the Gateway Change Gateway Pa…

QModbus例程分析

由于有一个Modebus上位机的需要&#xff0c;分析一下QModbus Slave的源代码&#xff0c;方便后面的开发。 什么是Modbus Modbus是一种常用的串行通信协议&#xff0c;被广泛应用于工业自动化领域。它最初由Modicon&#xff08;目前属于施耐德电气公司&#xff09;于1979年开发…

AXS4054:单节锂电池充电管理芯片特性与应用推荐

AXS4054是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;芯片集成功率晶体管&#xff0c;充电电流可以用外部电阻设定&#xff0c;蕞大持续充电电流可达600mA,非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不…

关于暨南大学电子信息复试机试篇

书接上回&#xff0c;上一篇文章为关于暨南大学智科院电子信息复试笔试篇&#xff0c;由于我误信了卖复试辅导书的店家说今年改机试&#xff0c;所以在复试方案出来之前&#xff0c;我一直都在准备机试&#xff0c;暨南大学的机试历年来一直都是四道编程题&#xff0c;可以使用…

【C++】C++11中的包装器和绑定器

目录 一、function包装器 1.1 可调用对象 1.2 概念 1.3 应用场景 二、bind绑定器 一、function包装器 1.1 可调用对象 我们平时使用的普通函数、函数指针、仿函数和Lambda表达式都是可调用对象&#xff0c;它们不仅可以作为其他函数的参数传入&#xff0c;还可以作为其他…

逻辑回归模型构建+PDP(部分依赖图)解析——Python代码及运行结果分析

一、逻辑回归模型简介 逻辑回归是一种广泛用于二分类问题的统计模型。它通过使用逻辑函数将预测结果映射到0到1之间&#xff0c;从而可以用于概率预测。模型的训练过程通常包括以下几个步骤&#xff1a; 数据预处理&#xff1a;处理缺失值、编码分类变量、标准化数值变量。特…

Python代码之特征工程基础

1. 什么是特征工程 特征工程是指从原始数据中提取、转换和创建适合于模型训练的数据特征的过程。它是机器学习和深度学习中非常重要的一步&#xff0c;因为好的特征工程可以显著提高模型的性能。特征工程涉及从数据中提取有意义的信息&#xff0c;并将其转换为模型可以理解和使…

[CP_AUTOSAR]_通信服务_DCM模块(二)_通用设计元素

目录 1、通用设计元素1.1、子模块1.2、NRC&#xff08;Negative Response Code&#xff09;1.3、Non-volatile 信息1.4、Types1.4.1、Atomic types overview1.4.2、Data array types overview1.4.3、Nested Data types overview1.4.4、Data types constraints1.4.5、Dcm_OpStat…

第一周、、

7-1 入度与出度 分数 10 全屏浏览 切换布局 作者 黄龙军 单位 绍兴文理学院 求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T&#xff0c;表示测试数据的组数&#xff0c;然后是T组测试数据。每组…