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)