【问题标题】:Does jetpack compose use drawable-night folder?jetpack compose 是否使用 drawable-night 文件夹?
【发布时间】:2021-05-04 11:33:03
【问题描述】:

我们有一个基于 View 的 Android 应用,在 res/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,但是我们需要在所有使用drawables的composables中测试夜间模式(isSystemInDarkTheme()):

Image(painter = painterResource(id = if (isSystemInDarkTheme()) R.drawable.foo_dark else R.drawable.foo_light))
    

在 compose 中是否有办法确保从白天或夜间模式中正确、透明地选取可绘制对象,就像在旧视图系统中一样?

【问题讨论】:

    标签: android android-jetpack android-jetpack-compose


    【解决方案1】:

    截至目前,“否”

    /drawable-night如何使用?

    Google 通过 Accompanist 提供了对一些基本 compose 实用程序的支持,而标准 Jetpack Compose 不提供这些工具。例如,PagerLayout、Swipe Refresh 和many more

    其中一个实用程序是Drawable Painter,您可以使用它。

    add dependency 之后,您可以通过以下方式使用此工具:

    
    @Composable
    fun DrawDrawable() {
        val drawable = AppCompatResources.getDrawable(LocalContext.current, R.drawable.foo)
    
        Image(
            painter = rememberDrawablePainter(drawable = drawable),
            contentDescription = "content description",
        )
    }
    
    

    Document Source

    注意: 不要期望 drawable 的深色变体会出现在 @Preview 中。但它会在运行时加载。

    【讨论】:

      【解决方案2】:

      也许 Compose 在发布其他答案后已更新,但我可以确认,在一个仅使用 Compose 和 drawabledrawable-night 文件夹中具有相同名称的两个可绘制对象的简单应用程序中,该应用程序正在接受黑暗一,如果手机设置为暗模式。

      这也没有定义可组合的主题,所以这个简单的代码就可以了:

      @Preview
      @Preview(uiMode = UI_MODE_NIGHT_YES)
      @Composable
      fun ImagePreview() {
          Image(
              painter = painterResource(id = R.drawable.my_icon),
              contentDescription = null
          )
      }
      

      请注意,您也可以在预览中看到这一点 - 有两个 @Preview 注释会在 Android Studio 中生成两个预览,并且指定您希望在暗模式下查看您的可组合也是可能的!

      【讨论】:

        【解决方案3】:

        查看当前在 theming codelab 中如何实现深色和浅色调色板,我将创建自己的有点相似的抽象:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-08
          • 1970-01-01
          • 1970-01-01
          • 2019-11-08
          • 2021-12-20
          • 2021-06-11
          • 1970-01-01
          • 2022-06-29
          相关资源
          最近更新 更多