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

news2025/3/10 23:33:03

一、加载本地矢量图标

在 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">
    <path
        android: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.viewModel

class 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.coloradmin.cn/o/1618375.html

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

相关文章

基于Vue+ElementPlus自定义带历史记录的搜索框组件

前言 基于Vue2.5ElementPlus实现的一个自定义带历史记录的搜索框组件 效果如图&#xff1a; 基本样式&#xff1a; 获取焦点后&#xff1a; 这里的历史记录默认最大存储10条&#xff0c;同时右侧的清空按钮可以清空所有历史记录。 同时搜索记录也支持点击搜索&#xff0c;按…

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;城镇化率 %、财政科学技术支出&#xff08;亿元&#xff09;、万人高等教育在校人数&#xff08;万人&#xff09;、财政教育支出&#xff08;亿元&#xff09;、第三产业占…

【后端】PyCharm的安装指引与基础配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、PyCharm是什么二、PyCharm安装指引安装PyCharm社区版安装PyCharm专业版 三、配置PyCharm&#xff1a;四、总结 前言 随着开发语言及人工智能工具的普及&am…

Discuz! X系列版本安装包

源码下载地址&#xff1a;Discuz! X系列版本安装包 很多新老站长跟我说要找Discuz! X以前的版本安装包&#xff0c;我们做Discuz! X开发已经十几年了&#xff0c;这些都是官方原版安装包&#xff0c;方便大家使用&#xff08;在官网已经找不到这些版本的安装包了&#xff09; …

4.23日总结(项目总结)

1.项目&#xff1a; 今日项目通过一个在登录界面的一个静态变量&#xff0c;完成了区分老师和学生&#xff0c;能够分开老师和学生&#xff0c;并且不同身份的人进去会有不同的显示&#xff0c;以及登录链接主界面&#xff0c;还有学生和老师的不同的表&#xff0c;其次就是创…

实现Spring底层机制(二)

文章目录 阶段2—封装bean定义信息到Map1.代码框架图2.代码实现1.文件目录2.新增注解Scope存储单例或多例信息Scope.java3.修改MonsterService.java指定多例注解4.新增bean定义对象存储bean定义信息BeanDefinition.java5.修改pom.xml增加依赖6.修改容器实现bean定义信息扫描Sun…

修改element-ui中el-calendar(日历)的样式

效果图如下&#xff1a; <template><div class"dashboard-container"><el-card style"width: 350px; height: auto; border-radius: 8px"><div class"custom-style"><p class"new-data">{{ newDate }}&…

Qt使用miniblink第三方浏览器模块

文章目录 一、前言二、miniblink简介三、miniblink使用四、运行效果五、工程结构 一、前言 本文取自刘典武大师&#xff1a;Qt编写地图综合应用58-兼容多浏览器内核 用Qt做项目过程中&#xff0c;遇到需要用到浏览器控件的项目&#xff0c;可能都会绕不开一个问题&#xff0c;那…

12-Makefile_03(续)

使用变量 使用C自动编译成*.o的默认规则有个缺陷&#xff0c;由于没有显式地表示*.o依赖于.h头文件&#xff0c;假如修改了头文件的内容&#xff0c;那么*.o并不会更新&#xff0c;这是不可接受的。并且默认规则使用固定的“cc”进行编译&#xff0c;假如想使用ARM-GCC进行交叉…

Nacos原理简单介绍

注册中心原理 官网&#xff1a;Nacos 注册中心的设计原理 | Nacos nacos注册中心采用了 &#xff1a;pull &#xff08;客户端的轮询&#xff09;和push &#xff08;服务端主动push&#xff09;策略 客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装…

树莓教育坚持特色引领,建设一流应用型影像培训

树莓教育&#xff0c;作为树莓集团旗下的子公司&#xff0c;自创立以来已经走过了十余个春秋。在这漫长的教育征程中&#xff0c;树莓教育始终坚守初心&#xff0c;秉持着七个坚持和十项行动的原则为数字影像产业的建设和发展做出了巨大的贡献。 七个坚持&#xff0c;是树莓教育…

【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 目录 …

大小端解释以及如何使用程序判断IDE的存储模式

今天让我们来了解一下大小端的概念吧 什么是大小端&#xff1f; 大端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位保存在内存的高地址处&#xff0c;而数据的高位则保存在内存的低地址处。 小端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位…

使用表格法插入公式和编号

如何将公式和编号优雅地插入到论文当中呢&#xff1f; 首先插入一个1行2列的表格 调整一下 输入公式方法一&#xff1a;感觉墨迹公式挺好用的&#xff0c;word自带的 输入公式方法二&#xff1a;图片转LATEX代码 这个方法更快 分享一个公式识别网站 图片识别得到LATEX代码&…

免费PNG素材网站推荐:设计效率倍增!

一、即时设计 新一代协同设计工具即时设计&#xff0c;内置丰富社区资源&#xff0c;可以在此获得设计前线的各类PNG图像&#xff0c;以及矢量图标&#xff0c;包括毛玻璃、3D混搭、全息投影、单色、平面化等&#xff0c;都是符合目前市场的主流风格。通过最近更新、作品、资源…

【ks爬虫软件】把快手评论API接口封装成GUI采集工具

用Python开发爬虫采集软件&#xff0c;可自动抓取快手评论数据&#xff0c;且包含二级评论。 快手的评论接口URL&#xff1a; # 请求地址 url https://www.kuaishou.com/graphql开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&#xff1a; 软件效…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

[vite] ts写配置根目录别名

参考:配置 Vite | Vite 写对象的形式吧 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {alias: {"": path.resolve(__dirname…

电磁仿真--基本操作-CST-(2)

目录 1. 回顾基操 2. 操作流程 2.1 创建工程 2.2 修改单位 2.3 创建 Shape 2.4 使用拉伸 Extrude 2.5 修改形状 Modify Locally 2.6 导入材料 2.7 材料解释 2.8 材料分配 2.9 查看已分配的材料 2.10 设置频率、背景和边界 2.11 选择 Edge&#xff0c;设置端口 2.…

Linux-进程间通信:System V消息队列

目录 System V IPC概述标识符与IPC Key System V消息队列创建或打开一个消息队列发送消息接收消息控制消息队列1、IPC_STAT2、IPC_SET3、IPC_RMID 查看系统当前的消息队列代码示例 System V IPC&#xff08;Inter-Process Communication&#xff09;是一组用于在 Unix-like 操作…