Как создать цвет, используя значения красного, зеленого и синего? — Составьте Реактивный ранец

#android #android-jetpack-compose

Вопрос:

Я пытаюсь создать цвет, используя значения RGB, но получаю следующую ошибку. Я не могу найти для этого решение.

 Color(148f, 148f, 148f, 1f)
 

Ниже приведена ошибка, которую я получаю:

 java.lang.IllegalArgumentException: red = 148.0, green = 148.0, blue = 148.0, alpha = 1.0 outside the range for sRGB IEC61966-2.1 (id=0, model=Rgb)
        at androidx.compose.ui.graphics.ColorKt.Color(Color.kt:405)
        at androidx.compose.ui.graphics.ColorKt.Color$default(Color.kt:398)
        at com.template.app.util.toast.CustomToast$successView$1$1.invoke(CustomToast.kt:86)
        at com.template.app.util.toast.CustomToast$successView$1$1.invoke(CustomToast.kt:83)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:384)
        at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:228)
        at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:227)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
        at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:148)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:114)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:113)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
        at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:106)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:162)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:161)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:161)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:144)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.ComposerKt.invokeComposable(Composer.kt:3330)
        at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2577)
        at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2573)
        at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotState.kt:540)
        at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2566)
        at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:2517)
        at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:476)
        at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:727)
        at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:432)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:144)
        at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:135)
 

Я проверил код цветового класса и обнаружил, что мне нужно указать ColorSpace , но я не могу найти подходящий ColorSpace для моего требования.

Ответ №1:

Конструктор, который вы используете, ожидает, что он будет находиться в диапазоне 0..1 .

Int Вместо этого используйте значения:

 Color(148, 148, 148, 255)
 

Комментарии:

1. Ух ты!! Это сработало идеально. Я попробовал это решение, но меня приняли 1 за альфу. Так что весь фокус в том, чтобы сойти 255 за альфу.

Ответ №2:

Вам нужно использовать ColorSpaces.Srgb для указания значений в диапазоне 0..255. Здесь в документации есть очень хорошая таблица: https://developer.android.google.cn/reference/kotlin/androidx/compose/ui/graphics/Color

Так что в принципе вы должны использовать его так

 Color(red = 148f, green = 148f, blue = 148f, alpha = 1f, ColorSpace.get(ColorSpaces.Srgb))
 

Комментарии:

1. Я пытался использовать это, но я также получаю ту же ошибку ColorSpaces.Srgb . Я получаю ту java.lang.IllegalArgumentException: red = 148.0, green = 148.0, blue = 148.0, alpha = 1.0 outside the range for sRGB IEC61966-2.1 (id=0, model=Rgb) же ошибку, если мы ее не указываем ColorSpaces .

2. Вы уверены, что правильно используете цветовое пространство? Я обновил ответ образцом

3. Вы пробовали это в своем коде? Потому что, если я применю ColorSpace.get(ColorSpaces.Srgb) это, я получу ошибку, которая ColorSpace.get не найдена в androidx.compose.ui.graphics.colorspace.ColorSpace

4. Я использовал это примерно 2 недели назад, и это сработало, но версия с Ints кажется еще проще 🙂