[Android]Jetpack Compose加载图标和图片

一、加载本地矢量图标

在 Android 开发中使用本地矢量图标是一种常见的做法,因为矢量图标(通常保存为 SVG 或 Android 的 XML vector format)具有可缩放性和较小的文件大小。
在 Jetpack Compose 中加载本地矢量图标可以使用内置的支持,也可以通过流行的第三方库来实现。

矢量图在线查询:https://fonts.google.com/icons?icon.set=Material+Icons

1.使用 Jetpack Compose 加载本地矢量图标

Jetpack Compose 原生支持加载 Android Vector Drawable 格式的图标。这些图标可以直接在 res/drawable 目录下以 XML 格式存储。

(1).创建 Vector Drawable

首先,在 res/drawable 目录中创建一个 Vector Drawable 文件。

例如,创建一个名为 ic_arrow_back.xml 的文件。

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><pathandroid:fillColor="#FF000000"android:pathData="M11,19l-7,-7 7,-7 1.41,1.41L6.83,12l5.58,5.59z"/>
</vector>

(2).在 Compose 中使用 Vector Drawable

在 Compose 函数中使用 painterResource 来加载并显示这个矢量图标。

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.painterResource
import com.example.myapp.R@Composable
fun BackIcon() {Image(painter = painterResource(R.drawable.ic_arrow_back),contentDescription = "返回")
}

2.使用流行的Material Icons库加载矢量图标

(1).使用material-icons-core库提供的基础矢量图标

在 Jetpack Compose 中,androidx.compose.material:material-icons-core 库提供了一组基本的 Material Design 图标,这个库是 androidx.compose.material:material 的一部分,通常已经包含在默认的 Compose 设置中。

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Icon@Composable
fun ExtendedIconExample() {Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = "返回")
}

(2).添加material-icons-extended库拓展矢量图标

这个库包含了更为广泛的图标集合,覆盖了更多的用例和设计需求。如果你需要更多特定的图标,比如 Icons.Filled.ArrowBackIos,就需要导入这个扩展库。

确保在项目的 build.gradle 文件中添加了 material-icons-extended 库的依赖。

查询最新版本:Maven Central: Search

dependencies {implementation('androidx.compose.material:material-icons-extended:1.6.2')  // 使用适合你项目的版本
}
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable@Composable
fun ExtendedIconExample() {Icon(imageVector = Icons.AutoMirrored.Filled.ArrowBackIos,contentDescription = "iOS风格的返回图标")
}

虽然你可能包含了 material-icons-extended 库,这个库确实包含了大量的图标资源,但是 Android 的构建系统(包括 Gradle 和 Android Studio)使用了一种称为资源清理(resource shrinking)的技术,这可以帮助移除未使用的资源,以减少最终 APK 的大小。

二、加载本地图片资源

1. 加载 Drawable 资源

如果你的图片已经作为资源文件存储在 res/drawable 或 res/mipmap 目录下,你可以使用 painterResource 方法来加载这些图片。这是最常见的方法,用于加载静态资源。

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.painterResource
import com.example.myapp.R@Composable
fun LoadDrawableResource() {Image(painter = painterResource(id = R.drawable.my_image),contentDescription = "描述性文本")
}

2. 加载 Asset 资源

assets 文件夹通常用于存储那些不会通过 Android 资源系统进行访问的文件,如字体文件、数据文件或图片等。

  • 在Android工程的main目录,选择 New > Folder > Assets Folder。按照向导完成assets文件夹的创建。
  • 将你想要在应用中使用的图片文件复制到这个新创建的 assets 文件夹中。你可以创建子文件夹来组织你的文件。

如果你的图片存储在 assets 文件夹中(这不同于资源文件夹 res),你需要使用 painterResource 方法的另一个形式或者 rememberImagePainter(需要引入外部库 Coil)来加载这些图片。

(1).使用基础库

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.assetPainter@Composable
fun LoadAssetImage() {Image(painter = assetPainter("images/my_image.png"),contentDescription = "描述性文本")
}

(2).使用 Coil

Coil 是一个流行的 Kotlin 图像加载库,它可以与 Compose 配合使用。

首先,添加 Coil 的依赖:

dependencies {implementation('io.coil-kt:coil-compose:2.6.0') 
}

然后,使用 rememberImagePainter 来加载图片:

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import coil.compose.rememberImagePainter@Composable
fun LoadAssetImageWithCoil() {Image(painter = rememberImagePainter("file:///android_asset/images/my_image.png"),contentDescription = "描述性文本")
}

3. 从文件系统加载图片

如果图片存储在设备的文件系统中,可以使用 Coil 来加载这些图片。

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import coil.compose.rememberImagePainter
import java.io.File@Composable
fun LoadImageFromFile(file: File) {Image(painter = rememberImagePainter(file),contentDescription = "描述性文本")
}

三、加载网络图片

虽然 Jetpack Compose 本身不提供直接加载网络图片的组件,但可以很容易地通过集成第三方库如 Coil 或 Glide 来实现。这里主要介绍使用 Coil 来加载网络图片,因为 Coil 被设计为支持 Kotlin 协程,且与 Jetpack Compose 集成良好。

1.使用 Coil 加载网络图片

Coil (Coil-kt) 是一个现代的图片加载库,它使用 Kotlin 协程进行异步加载,并且为 Compose 提供了专门的支持。

(1).添加 Coil 的依赖

dependencies {implementation('io.coil-kt:coil-compose:2.6.0') 
}

(2).编写 Compose 函数以加载和显示图片

在你的 Composable 函数中,使用 rememberImagePainter 来创建一个 Painter 对象,该对象负责异步加载图片。然后,你可以使用 Image 组件来显示这张图片。

import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import coil.compose.rememberImagePainter@Composable
fun NetworkImage(url: String) {val painter = rememberImagePainter(data = url, builder = {placeholder(R.drawable.placeholder) // 加载中的占位图error(R.drawable.error) // 错误时的图片})Image(painter = painter,contentDescription = "网络图片",modifier = Modifier.fillMaxWidth() // 根据需要调整修饰符)
}

在这个例子中,url 是图片的网络地址。placeholder 和 error 是可选的,分别用于在图片加载时和加载失败时显示的图片。这些图片需要放在你的资源目录(res/drawable)下。

2.Coil 的高级配置

Coil 提供了许多配置选项来自定义图片加载的行为,例如缓存策略、图片解码、请求优先级等。你可以在 builder lambda 表达式中配置这些选项。

val painter = rememberImagePainter(data = url, builder = {crossfade(true) // 启用淡入淡出效果transformations(CircleCropTransformation()) // 应用圆形裁剪
})

3.处理图片加载状态

Coil 提供了监听加载状态的功能,可以用来显示加载进度、处理错误或其他自定义行为。

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import coil.compose.AsyncImage
import coil.compose.AsyncImagePainter@Composable
fun NetworkImageWithStatus(url: String) {Box(contentAlignment = Alignment.Center) {val painter = rememberImagePainter(url)Image(painter = painter, contentDescription = "网络图片")when (painter.state) {is AsyncImagePainter.State.Loading -> CircularProgressIndicator()is AsyncImagePainter.State.Error -> Text("加载失败")else -> {} // 在其他状态不显示任何东西}}
}

四、加载本地其它资源文件

在 Jetpack Compose 中加载本地资源文件主要涉及到两种常见的资源:图片和其他类型的文件(例如文本文件或JSON文件)。

1.添加文件到资源目录

将你的文件(如 example.txt 或 data.json)放入 res/raw 文件夹中。如果该文件夹不存在,你可以创建它。

2.在 Compose 中读取文件

你需要使用 Android 的资源管理 API 来读取这些文件。这通常不是在 Composable 函数中直接完成的,而是应该在 ViewModel 或其他数据管理类中处理。

import android.content.Context
import androidx.compose.runtime.Composable
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewmodel.compose.viewModelclass FileViewModel(private val context: Context) : ViewModel() {fun readRawResource(): String {val inputStream = context.resources.openRawResource(R.raw.example)return inputStream.bufferedReader().use { it.readText() }}
}@Composable
fun DisplayFileContents(viewModel: FileViewModel = viewModel()) {val contents = viewModel.readRawResource()Text(text = contents)
}

在这个例子中,R.raw.example 是你放在 res/raw 目录下的文件的资源 ID。

五、处理图像的缩放和裁剪

1.图像的缩放

缩放通常涉及调整图像的大小以适应或填充特定的空间。在 Compose 中,这可以通过设置 Image 组件的 contentScale 属性来实现:

  • ContentScale.Fit - 图像将被统一缩放(保持图像的宽高比),以确保整个图像适配容器的边界。这通常意味着图像的某些边可能不会触及容器的边界。
  • ContentScale.Crop - 图像将被统一缩放(保持图像的宽高比),直到填满容器的边界,可能会裁剪图像的部分内容。
  • ContentScale.FillBounds - 图像将被缩放以完全填充容器,但不保持宽高比,可能导致图像失真。
  • ContentScale.FillHeight / ContentScale.FillWidth - 图像将被缩放以填充容器的高度或宽度,同时保持图像的宽高比。
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource@Composable
fun ScaledImage() {Image(painter = painterResource(id = R.drawable.your_image),contentDescription = "缩放的图像",modifier = Modifier.fillMaxSize(),contentScale = ContentScale.Crop // 根据需求选择适合的缩放模式)
}

2.图像的裁剪

在 Jetpack Compose 中,裁剪图像通常可以通过使用 clip Modifier 和 Shape 来实现。这允许你创建各种形状(如圆形、矩形等),并且只显示图像的相应部分。

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ClipOp
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp@Composable
fun CroppedImage() {Image(painter = painterResource(id = R.drawable.your_image),contentDescription = "裁剪的图像",modifier = Modifier.size(150.dp).clip(CircleShape) // 使用圆形裁剪,也可以使用 RoundedCornerShape(10.dp) 等其他形状)
}

在这个例子中,使用 CircleShape 来裁剪图像为圆形。如果希望有圆角矩形,可以改用 RoundedCornerShape 并指定角的半径。

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

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

相关文章

FreeRTOS学习 -- 任务

一、什么是任务系统 单片机裸跑的时候一般都是在main函数里面用 while (1) 做一个大循环来完成所有的处理&#xff0c;即应用程序是一个无限的循环&#xff0c;循环中调用相应的函数完成所需的处理。这个就是单任务系统&#xff0c;也称为前后台系统&#xff0c;中断服务函数作…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

SpringMVC中的文件上传和中英文名称文件下载

一、文件上传 前端&#xff1a; <% page language"java" contentType"text/html;charsetUTF-8"pageEncoding"UTF-8"%> <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4…

如何使用 Fly.io 和 Tigris 部署 Next.js 应用

在本教程中&#xff0c;您将学习到应用部署平台 Fly.io 和全球分布式的 S3 兼容对象存储服务 Tigris。 这两个平台密切相关&#xff0c;使它们成为您项目的绝佳选择。您可以从 Fly.io 获得应用部署体验&#xff0c;并从 Tigris 获得对象存储功能。 应用部署相当简单易懂&…

2001-2021年上市公司制造业智能制造词频统计数据

2001-2021年上市公司制造业智能制造词频统计数据 1、时间&#xff1a;2001-2021年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;年份、股票代码、行业名称、行业代码、所属省份、所属城市、智能制造词频、智能制造占比(%) 4、范围&#xff1a;上市公司 5、样本量…

探索嵌入式系统:快速入门指南概览

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

OpenHarmony实战开发-性能测试工具SmartPerf Editor使用指导

概述 SmartPerf Editor是一款PC端桌面应用&#xff0c;通过监测、采集应用运行时FPS、CPU、GPU、Memory、Battery、Network等性能数据&#xff0c;帮助开发者了解应用的性能状况。SmartPerf Editor还集成了DrawingDoc功能&#xff0c;可录制Render Service绘制指令&#xff0c…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具&#xff0c;它旨在提供实时数据收集和可视化功能&#xff0c;帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据&#xff0c;并将其记录为轻量级的 Trac…

开发环境中的调试视图(IDEA)

当程序员写完一个代码时必然要运行这个代码&#xff0c;但是一个没有异常的代码却未必满足我们的要求&#xff0c;因此就要求程序员对已经写好的代码进行调试操作。在之前&#xff0c;如果我们要看某一个程序是否满足我们的需求&#xff0c;一般情况下会对程序运行的结果进行打…

茶饮门店本地生活抖音团购运营方案计划书

【干货资料持续更新&#xff0c;以防走丢】 茶饮门店本地生活抖音团购运营方案计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑80页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音本地生活运营方案 1. 账号基础搭建与优化 - 门店账号…

Php-WebView 现代跨平台 GUI分享

GitHub :php-webview 一个用于 C/C 的小型跨平台 Web 视图库&#xff0c;用于构建现代跨平台 GUI。 该项目的目标是为最广泛使用的平台创建一个通用的 HTML5 UI 抽象层。 它支持双向 JavaScript 绑定&#xff08;从 C/C 调用 JavaScript 和从 JavaScript 调用 C/C&#xff09;。…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…

我的世界服务器设计思路应该是什么样?

我的世界服务器设计思路可以从这4个方面展开&#xff1a;1.选择你喜欢的东西&#xff1b;2.认识你的极限&#xff1b;3.注入新鲜元素&#xff1b;4.让服务器变得享受且有回报。 1.选择你喜欢的东西 设计服务器的首要规则是创造一些你自己会积极享受玩的东西。没有人愿意花费宝…

在Spring boot中指定随机可用的端口

​ 正常情况下每个spring boot启动都有固定的端口&#xff0c;也就是8080&#xff0c;如果启动多个项目&#xff0c;很容易出现端口冲突&#xff0c;那么怎么解决这个问题呢&#xff1f; 解决方案1&#xff1a; random 随机端口 ​ 在spring boot中&#xff0c;可以通过${ran…

linux的一些实用操作

快捷键 强制停止 ctrlc强制停止或退出命令的输入 退出登出 ctrld强制退出用户登录或退出某些程序的专属页面&#xff08;如py&#xff09; ps&#xff1a;不能退出vi/vim 历史命令搜索 history可以查看历史命令&#xff0c;用来复制粘贴 在使用history之后&#xff0c;…

fnm:Rust开发的高效Node版本管理工具

简介 fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, buil…

pycharm-git 配置(1)

1.安装git2.pycharm 中配置git 插件 弹出Git版本号&#xff0c;即配置成功。3.创建本地仓库 VCS->VCS operations->create repository->设置本地目录 左下角可以看到git本地仓库git可以看到push,commit。 4.配置远方仓库&#xff0c;此时确保git上是有这个项目…

【linux】chmod权限开放(整个文件夹)

文章目录 起因权限查看权限修改 失败权限修改成功 起因 想要共享conda环境给同事&#xff0c;发现同事没权限。 权限查看 ls #查看当前目录 ls -l # 查看当前目录的东西和权限正常情况下是显示 三个rwx分别属于user&#xff0c;group&#xff0c;others 前面第一个rwx 是针…

美容预约小程序:简单三步,开启高效预约模式

在当今的数字化时代&#xff0c;一个小程序可以极大地提高美容院的效率和客户满意度。下面我们将详细说明如何通过以下步骤来搭建一个美容院预约小程序。 首先&#xff0c;你需要注册并登录到乔拓云网&#xff0c;这是 一个在线平台&#xff0c;可以帮助你快速创建并管理你的小…