ImageBitmap 与 ImageVector

两种最常见的图像格式是光栅图像和矢量图像。

光栅图形格式包含像素:微小的单个正方形,包含颜色(由红色、绿色、蓝色和 alpha 值组成)。将许多像素放在一起时,可以形成非常详细的图像,例如照片。光栅图形具有固定分辨率(固定像素数量)。这意味着当您增加图像的大小,它会失去细节,并且可能出现像素化。光栅图形格式的示例包括 JPEG、PNG 和 WEBP。

JPEG file example
图 1:JPEG 文件示例

另一方面,矢量图是屏幕上视觉元素的可缩放数学表示。矢量是一组描述如何在屏幕上绘制图像的命令——例如,一条线、一个点或一个填充。当在屏幕上缩放矢量时,它不会失去质量,因为数学公式将保持不同命令之间的关系。ImageVector 的一个很好的例子是 Material Symbols,因为它们都可以用数学公式定义。

Vector example (file extensions are .xml or defined in Kotlin code)
图 2:矢量示例(文件扩展名为 .xml 或在 Kotlin 代码中定义)

ImageBitmap

在 Compose 中,光栅图像(通常称为 Bitmap)可以加载到 ImageBitmap 实例中,而 BitmapPainter 负责将位图绘制到屏幕上。

对于简单的用例,可以使用 painterResource(),它负责创建 ImageBitmap 并返回一个 Painter 对象(在本例中为 BitmapPainter

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description)
)

如果您需要进一步的定制(例如 自定义画家实现)并且需要访问 ImageBitmap 本身,您可以按照以下方式加载它

val imageBitmap = ImageBitmap.imageResource(R.drawable.dog)

ImageVector

一个 VectorPainter 负责将 ImageVector 绘制到屏幕上。 ImageVector 支持 SVG 命令的子集。并非所有图像都可以表示为矢量(例如,您使用相机拍摄的照片无法转换为矢量)。

您可以通过导入现有的矢量可绘制 XML 文件(使用 导入工具 导入到 Android Studio 中)或实现类并手动发出路径命令来创建自定义 ImageVector

对于简单的用例,painterResource()ImageBitmap 类的工作方式与对 ImageVectors 的工作方式相同,返回一个 VectorPainter 作为结果。 painterResource() 处理将 VectorDrawablesBitmapDrawables 分别加载到 VectorPainterBitmapPainter 中。要将 VectorDrawable 加载到图像中,请使用

Image(
    painter = painterResource(id = R.drawable.baseline_shopping_cart_24),
    contentDescription = stringResource(id = R.string.shopping_cart_content_desc)
)

如果您需要进一步定制并需要访问 ImageVector 本身,您可以按照以下方式加载它

val imageVector = ImageVector.vectorResource(id = R.drawable.baseline_shopping_cart_24)