Jetpack Compose是否使用drawable-night文件夹?

7
我们有一个基于 View 的 Android 应用,其中某些 drawable 存储在 res/drawable 文件夹中,对应的夜间模式 Drawable 存储在 res/drawable-night 文件夹中。
在使用旧版视图时,从 XML 布局文件中引用可绘制对象 R.drawable.foo 时,系统会根据当前是否处于白天或黑夜模式来从 res/drawableres/drawable-night 文件夹中选择可绘制对象。
在使用 Jetpack Compose 时,我们可以像这样在 Image Composable 中引用 Drawable:
Image(painter = painterResource(R.drawable.foo))

然而,这将始终从“res/drawable”文件夹中选择drawable,忽略白天/黑夜模式。
我们可以做类似于以下的操作来选择正确的drawable,但需要在使用基于夜间模式的drawable的所有组合件中测试夜间模式(isSystemInDarkTheme())。
Image(painter = painterResource(id = if (isSystemInDarkTheme()) R.drawable.foo_dark else R.drawable.foo_light))
    

有没有一种方法可以在Compose中确保正确地选择白天或夜晚模式的drawable,并使其像传统视图系统一样透明?
3个回答

8
也许自其他答案发布以来,Compose已经更新,但我可以确认,在一个简单的应用程序中,仅使用Compose和两个具有相同名称的可绘制对象(在drawable和drawable-night文件夹中),如果手机设置为深色模式,则应用程序会选择深色主题。这也没有定义一个组合主题,因此这段简单的代码就能完成任务:
@Preview
@Preview(uiMode = UI_MODE_NIGHT_YES)
@Composable
fun ImagePreview() {
    Image(
        painter = painterResource(id = R.drawable.my_icon),
        contentDescription = null
    )
}

请注意,您也可以在预览中查看此内容 - 在Android Studio中拥有两个@Preview注释会生成两个预览,并且指定您想要在暗模式下查看组合内容也是可能的!

dark and light images in compose preview


0

看到主题编码实验室中目前实现的暗色和亮色调色板,我会创建自己的类似抽象。

class LightDrawables: Drawables

class DarkDrawables: Drawables

fun getDrawable(darkTheme: Boolean = isSystemInDarkTheme(), @DrawableRes drawableRes: Int) = if(darkTheme) DarkDrawables.xy else LightDrawables.xy

0

目前为止,“NO”

如何使用/drawable-night

Google通过 Accompanist 提供了一些基本的Compose工具,这些工具不随标准Jetpack Compose一起提供。例如,PagerLayout、Swipe Refresh和许多其他工具

其中一个工具是Drawable Painter,这是你可以使用的东西。

在你添加依赖之后,你可以使用以下工具:


@Composable
fun DrawDrawable() {
    val drawable = AppCompatResources.getDrawable(LocalContext.current, R.drawable.foo)

    Image(
        painter = rememberDrawablePainter(drawable = drawable),
        contentDescription = "content description",
    )
}

文档来源

注意: 不要期望在@Preview中显示出可绘制的暗变体。但它会在运行时加载。


不适用于我。 - rafakob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接