首页 > 解决方案 > Jetpack Compose:自定义 VectorAsset 图标对象,类似于内置的 `Icons.Default`

问题描述

看起来从res文件夹中的 Android Vector Resources 加载自定义图标的唯一方法是@Composable使用该方法在函数中执行此操作vectorResource(R.drawable.myVectorName)

这很好,但我喜欢获取类的语法VectorAssetsIcon(asset: VectorAsset)它看起来像Icon(Icons.Default.Plus).

看起来该vectorResource()方法使用了一个名为的内部loadVectorResource()方法,并且它用于读取构成矢量资产文件的实际 XML 文件的方法也是内部的。

我将如何像MyAppIcons.Default.SomeIcon在 Jetpack Compose 中那样创建对象?

编辑

所以,我已经找到了一个解决方案。但是,我自己对内置Icon()函数进行扩展/重载会很好,但我不确定是否有合适的方法来做到这一点。

标签: androidkotlinandroid-jetpack-composekotlin-android-extensionsandroid-vectordrawable

解决方案


原来我没有用我的大脑。答案很简单。

要点是,Icon() 一个可组合的函数,这意味着当然可以在那里使用vectorResource() 。

所以,正确的方法不是秘密......它是制作自己的MyAppIcon()组件,调用vectorResource()然后返回一个 normal Icon(),如下所示:

正确的方式

@Composable
fun MyAppIcon(
    resourceId: Int,
    modifier: Modifier = Modifier,
    tint: Color = AmbientContentColor.current
) {
    Icon(
        asset = vectorResource(id = resourceId),
        modifier = modifier,
        tint = tint
    )
}

然后,您可以在其他地方创建一个对象,如下所示:

object MyAppIcons {
    val SomeIcon = R.drawable.someIcon
    val AnotherIcon = R.drawable.anotherIcon
}

当你把两者放在一起时,你可以像这样使用它:

MyAppIcon(MyAppIcons.SomeIcon)

我希望谷歌很快就会添加这个覆盖,允许我们传递资源 ID。


推荐阅读