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 命令的一个子集。并非所有图像都可以表示为矢量(例如,您用相机拍摄的照片无法转换为矢量)。

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

对于简单用例,painterResource()ImageBitmap 类的工作方式也适用于 ImageVectors,它返回一个 VectorPainter 作为结果。painterResource() 分别处理 VectorDrawablesBitmapDrawablesVectorPainterBitmapPainter 的加载。要将 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)