A partir de Android 12, el diseño de Material You se centra en la expresión y la fluidez en el sistema operativo Android, con el objetivo de ayudar a los usuarios a crear y poseer una experiencia única y cohesiva que se adapte a sus necesidades. Como socio de Android, se le anima a incorporar Material que usted diseña en sus dispositivos Android en las siguientes áreas:
- color dinámico
- Movimiento
- Widgets
color dinámico
El color dinámico es la pieza central del diseño de Material You y una parte clave de la estrategia de varios años de Android para brindar una personalización más simple y profunda a sus usuarios de una manera que no lo hacen otros dispositivos. Material que ofrece:
Usuarios y desarrolladores una historia consistente y rica de personalización disponible en cualquier dispositivo Android.
Los OEM de Android tienen la oportunidad de continuar innovando la interfaz de usuario del sistema y las aplicaciones propias de una manera que esté en línea con el color, la marca y la forma de su hardware y marca.
Para aprovechar el color dinámico, use la historia de extracción de color Material You de Android 12 como una parte clave de su oferta de software para los usuarios. En el dispositivo, use la lógica de extracción de color que está en AOSP, especialmente la lógica que toma un solo fondo de pantalla o color de origen de tema y lo genera a través de API de 65 colores. Para conocer los requisitos de color dinámico, consulte Uso de color dinámico .
El flujo de color dinámico completo incluye cuatro pasos, como se ilustra a continuación:
Figura 1. Flujo de color dinámico de Material You
El usuario cambia el fondo de pantalla o el tema a través del selector de OEM.
El usuario selecciona uno de los siguientes:
Tema del dispositivo. Cuando se selecciona, Android elige automáticamente un solo color de origen que cumple con los requisitos.
Nuevo fondo de pantalla + tema. Cuando se selecciona, la lógica AOSP selecciona automáticamente un único color de origen del fondo de pantalla seleccionado.
AOSP expande el color de origen único en 5 paletas tonales con 13 variantes de color tonal cada una, según la lógica AOSP, que luego completa los 65 atributos de color.
La interfaz de usuario de la aplicación utiliza los atributos de 65 colores de una manera coherente en todo el ecosistema de aplicaciones de Android. Se recomienda utilizar la misma paleta de colores para la interfaz de usuario del sistema del dispositivo y las aplicaciones específicas del OEM.
parches de android 12
Para obtener la lógica integral para la extracción del color del fondo de pantalla y permitir que el dispositivo llene las API de 65 colores de manera coherente con el ecosistema, incluya los siguientes parches en su implementación de Android 12:
Obligatorio
Muy recomendado
- Se corrigió la condición de carrera al configurar los props del sistema de color de arranque.
- Permitir que las superposiciones reciban notificaciones sobre cambios de tema
- Arreglar la condición de carrera al configurar los props del sistema de color de arranque (ronda 2)
- Mover FeatureFlags al paquete de banderas.
- Implementar correctamente la compatibilidad con temas multiusuario
- Reparar la opción de color de fondo de pantalla especificada que falta después de reiniciar
- Soluciona el error de cálculo del tono terciario
- No permitir que las aplicaciones en segundo plano cambien de tema
Especificación de colores personalizados en ThemePicker
Si está utilizando la aplicación AOSP ThemePicker, la aplicación WallpaperPicker muestra la sección de color si se cumplen las dos condiciones siguientes:
-
flag_monet
enframeworks/base/packages/SystemUI/res/values/flags.xml
estrue
. - Se define un APK de código auxiliar del sistema con el nombre del paquete en
themes_stub_package
en el archivopackages/apps/ThemePicker/res/values/override.xml
.
Formato APK de resguardo
Puede encontrar una versión de muestra de este APK en packages/apps/ThemePicker/themes
.
Este APK debe contener solo recursos, detallando los colores básicos disponibles y sus nombres.
El resguardo debe contener un archivo XML en res/xml
con el siguiente formato:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="color_bundles">
<item>color1</item>
<item>color2</item>
<item>color3</item>
<item>color4</item>
</array>
<string name="bundle_name_color1">Blue</string>
<string name="bundle_name_color2">Red</string>
<string name="bundle_name_color3">Yellow</string>
<string name="bundle_name_color4">Green</string>
</resources>
En este archivo, cada item
dentro de color_bundles
tiene un nombre distinto, siempre que las cadenas a continuación se llamen bundle_name_ item
.
Debe haber una cadena bundle_name_ item
para cada color, con un nombre descriptivo para cada color. Estos se pueden traducir agregando las cadenas traducidas correspondientes en los directorios res/values- language code
.
Los valores de color reales pueden estar en el mismo XML o en un archivo XML de recursos separado con el siguiente formato:
<resources>
<color name="color_primary_color1">#0000FF</color>
<color name="color_secondary_color1">#0000FF</color>
<color name="color_primary_color2">#ff0000</color>
<color name="color_secondary_color2">#ff0000</color>
<color name="color_primary_color3">#ffff00</color>
<color name="color_secondary_color3">#ffff00</color>
<color name="color_primary_color4">#00ff00</color>
<color name="color_secondary_color4">#00ff00</color>
</resources>
Para cada elemento de la matriz de paquetes de colores, debe haber una entrada color_primary_ item
y color_secondary_ item
(y ambos colores deben ser del mismo color). Los valores para estas entradas color
son los códigos de color reales para cada color que se mostrarán en la sección de colores básicos .
Paso 1: Cree una experiencia de tematización de usuario
El selector de temas es donde los usuarios interactúan con las nuevas capacidades de personalización de Material You y potencialmente eligen entre opciones de color o ajustes preestablecidos. Como se adapta a su producto y a la demografía del usuario, puede ofrecer a los usuarios una personalización más rica y una experiencia de color mediante el uso de un selector de temas o un selector de papel tapiz .
- Cuando se utiliza un selector de papel tapiz, la extracción del color del papel tapiz está activada de manera predeterminada. Sin embargo, puede realizar algunas personalizaciones en el selector para proporcionar más opciones al usuario.
Paso 2: extraiga el color del papel tapiz en un color de origen
Para habilitar la extracción del color del fondo de pantalla, seleccione los parches de Android 12 enumerados anteriormente (esta funcionalidad se habilitará de forma predeterminada en una versión futura de AOSP). La lógica de AOSP que activa la extracción del fondo de pantalla comienza en frameworks/base/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
, en ThemeOverlayController#mOnColorsChangedListener
, a través de WallpaperManager#onWallpaperColorsChanged
. Recomendamos utilizar la lógica AOSP sin modificar para garantizar una experiencia de desarrollo coherente.
De forma predeterminada, la lógica elige el color de mayor frecuencia que sea adecuado para su uso. Para aprovechar otros colores de origen devueltos por el algoritmo y presentar esos colores a los usuarios en el selector de temas, use ColorScheme#getSeedColors(wallpaperColors: WallpaperColors)
.
Para ser adecuado para su uso, un color de origen (ya sea extraído de un fondo de pantalla o de un ajuste preestablecido elegido por el usuario) debe tener un valor de croma CAM16 mínimo de 5; esto garantiza que el color de origen no se vea afectado por sutiles tonos oscuros cuando se convierte de un solo color a 65 colores tonales y sigue siendo representativo de la elección del usuario. Para leer y modificar colores en CAM16, use Cam#fromInt
o Cam#getInt
.
Uso de una paleta de colores no dinámica Para los dispositivos que no admiten la extracción del color del fondo de pantalla, aún puede asegurarse de que las aplicaciones de Google y las aplicaciones de terceros que admiten el color dinámico se vean bien haciendo lo siguiente:
- Use la paleta de materiales predeterminada al deshabilitar
flag_monet
enframeworks/base/packages/SystemUI/res/values/flags.xml
.- Asegúrese de que los usuarios aún puedan personalizar su sistema operativo utilizando un selector de temas predeterminado.
Paso 3: expanda el color de origen en API de color
Utilizando el color de origen único derivado del paso anterior, Android genera 5 paletas tonales únicas (acento 1-3, neutral 1-2), cada paleta incluye 13 colores y cada color incluye diferentes valores de luminancia (0 a 1000), para un total de 65 colores. La lógica provista en los parches de Android 12 implementa correctamente esta expansión de color; los detalles proporcionados a continuación describen la implementación.
Para mantener la consistencia del revelador, las 5 paletas tonales (accent1, accent2, accent3, neutral1, neutral2) y sus 13 colores correspondientes deben basarse en el color de origen único con los cambios respectivos en los valores cromáticos y de tono de CAM16 como se indica a continuación:
- Croma: usa "16"
- Hue: igual que la fuente
- Croma: usa "32"
- Matiz: rotar 60 grados positivos
- Croma: usa "4"
- Hue: igual que la fuente
- Croma: usa "8"
- Hue: igual que la fuente
CTS incluye pruebas para validar las llamadas API de luminancia y tono. Para ejecutar, use atest SystemPalette
.
Paso 4: use colores dinámicos en las aplicaciones y la interfaz de usuario del sistema
Después de configurar los colores dinámicos en un dispositivo, las aplicaciones siguen las pautas de materiales para utilizar los colores. Las pautas de materiales deben publicarse en material.io antes del 26 de octubre de 2021 para que las adopten las aplicaciones de terceros. Para la interfaz de usuario del sistema y las aplicaciones propias, recomendamos enfáticamente integrar colores dinámicos en toda la experiencia del usuario de una manera que se ajuste a su hardware y marca y lo ayude a diferenciar sus dispositivos.
Para obtener una guía general de color dinámico, consulte lo siguiente:
Use colores de acento para los elementos de primer plano en las aplicaciones y la interfaz de usuario del sistema:
@android:color/system_accent1_0 … 1000 // most-used foreground color group @android:color/system_accent2_0 … 1000 // alternate accent, used for surfaces @android:color/system_accent3_0 … 1000 // playful, analogous color
Use colores neutros para los elementos de fondo en las aplicaciones y la interfaz de usuario del sistema:
@android:color/system_neutral1_0 … 1000 // most-used background color group @android:color/system_neutral2_0 … 1000 // used for higher-elevation surfaces
Para obtener más información sobre cómo Material You asigna los colores y cómo se utilizan las API en SysUI, consulte Recursos adicionales .
Paso 5: agregue opciones de color dinámico en su implementación AOSP WallpaperPicker
Construido para Android 13 y superior
A partir de Android 13, android.theme.customization.accent_color
está obsoleto. Se agregó un nuevo atributo android.theme.customization.theme_style
para admitir diferentes variantes de color. Actualmente tenemos cuatro variantes en el código base de la siguiente manera:
TONAL_SPOT = Default Material You theme since Android S.
VIBRANT = Theme where accent 2 and 3 are analogous to accent 1.
EXPRESSIVE = Highly chromatic theme.
SPRITZ = Desaturated theme, almost grayscale.
Estos se envían a Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
, como se muestra en JSON a continuación:
{
"android.theme.customization.system_palette":"B1611C",
"android.theme.customization.theme_style":"EXPRESSIVE"
}
Compilación para Android 12 y versiones anteriores
Al usar un selector de tema personalizado, el dispositivo debe enviar un color de origen válido a Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
proporcionando un archivo JSON en el siguiente formato (donde 746BC1
es un ejemplo de color de origen válido):
{
"android.theme.customization.system_palette":"746BC1",
"android.theme.customization.accent_color":"746BC1"
}
Al hacer esto, se salta la extracción del color del papel tapiz (Paso 2) y se expande directamente el color de origen provisto en 65 atributos de color (Paso 3).
Paso 6: Presente un boleto
Además de la integración del sistema, debe presentar un ticket y hacernos saber su nombre de marca ( Build.MANUFACTURER
). Dado que la mayoría de las aplicaciones de terceros utilizan los componentes de material para Android para mostrar colores dinámicos, utilizamos una lista de permitidos codificada para indicar qué dispositivos han integrado la función de paletas tonales de colores dinámicos .
Movimiento
El movimiento fluido hace que los dispositivos se sientan modernos y premium. Para generar y mantener la confianza y la felicidad de los desarrolladores, el overscroll y el ripple son dos partes clave del movimiento fluido que deben verse y sentirse consistentes.
Uso de overscroll en su sistema operativo
Android 12 incluye un movimiento de overscroll dinámico y con mayor capacidad de respuesta en forma de extensión de vista, que se muestra cuando el usuario intenta desplazarse más allá del borde de una lista. A continuación se muestra un ejemplo:
Figura 2. Efecto de desplazamiento excesivo de Android 12, como se muestra en Configuración
Para mantener la coherencia del desarrollador, asegúrese de que el efecto general de desplazamiento excesivo en sus dispositivos sea similar al siguiente:
En los dispositivos que devuelven verdadero para
ActivityManager.isHighEndGfx()
, el efecto de desplazamiento excesivo es un estiramiento no lineal de la pantalla (como se muestra arriba).En dispositivos de bajo rendimiento, el efecto de estiramiento se simplifica a un estiramiento lineal (para reducir la carga en el sistema).
Uso de overscroll en aplicaciones propias
Al usar vistas personalizadas, es posible que deba modificar algunas aplicaciones y la interfaz de usuario del sistema que usan el efecto de estiramiento.
Para admitir el overscroll extendido, actualice a las bibliotecas más recientes:
-
androidx.recyclerview:recyclerview:1.3.0-alpha01
paraRecyclerView
-
androidx.core:core:1.7.0-alpha01
paraNestedScrollView
yEdgeEffectCompat
-
androidx.viewpager:viewpager:1.1-alpha01
paraViewPager
-
Para diseños personalizados que usan
EdgeEffect
, considere los siguientes cambios de UX:Con el overscroll estirado, los usuarios no deben interactuar con el contenido del diseño mientras se estira. Los usuarios deben manipular solo el tramo en sí y no, por ejemplo, poder presionar un botón en el contenido.
Cuando los usuarios tocan el contenido mientras se produce la animación
EdgeEffect
, deben captar la animación y poder manipular el estiramiento. El valor de extracción actual está disponible enEdgeEffectCompat.getDistance()
.Para manipular el valor de extracción y devolver la cantidad consumida, usa
onPullDistance()
. Esto permite a los desarrolladores pasar sin problemas de estirar a desplazar mientras el dedo estira el contenido más allá de la posición inicial.Cuando se trabaja con el desplazamiento anidado, si el contenido se estira, el estiramiento debe consumir el movimiento táctil antes que el contenido anidado o, de lo contrario, el anidamiento puede desplazarse cuando el dedo cambia de dirección en lugar de soltar el estiramiento.
Para obtener detalles sobre el desplazamiento excesivo, consulte Animar un gesto de desplazamiento .
Uso de ondulación (retroalimentación táctil) en su sistema operativo
Android 12 incluye una ondulación táctil más suave y sutil para proporcionar comentarios a los usuarios al presionar hacia abajo.
Figura 3. Efecto dominó de Android 12, con una animación de relleno más suave
Para la previsibilidad del desarrollador y para brindar una excelente experiencia de usuario, asegúrese de que el efecto dominó en sus dispositivos sea similar al ejemplo que se muestra arriba. Si bien no necesita realizar ningún paso de integración específico para admitir los efectos dominó, debe probar el efecto en sus dispositivos para comprobar si se han introducido regresiones no deseadas en su implementación.
Widgets
Los widgets son componentes clave de un dispositivo Android. Android 12 incluye nuevas API y capacidades de API que todos los OEM deberían admitir.
En su sistema operativo, admita las API de desarrollador relacionadas con los diseños de widgets, el tamaño y los parámetros de software (por ejemplo, el tamaño de las esquinas redondeadas). Su implementación debe admitir correctamente los widgets al proporcionar parámetros a través de las API y garantizar que el usuario pueda configurar y dimensionar los widgets.
En sus aplicaciones, aproveche las nuevas capacidades de la API para actualizar o crear nuevos widgets propios cuando sea posible. Para todos los widgets de aplicaciones propias que estén a su alcance, consulte la lista de verificación para desarrolladores que se encuentra a continuación.
- La prioridad se basa en las recomendaciones de la plataforma.
- Para obtener detalles sobre una recomendación, siga el enlace en la columna Cambiar.
Área Cambiar Prioridad de implementación Mejorar la experiencia en el hogar Agregar vistas previas escalables P1 Agregar una descripción del widget P1 Facilite la personalización de widgets P2 (opcional) Habilite transiciones más suaves P0 Evite los trampolines de transmisión P0 Adoptar pautas de widgets Mejorar los tamaños y diseños de los widgets P2 Aplicar colores dinámicos P0 Implementar esquinas redondeadas P0 Agregar nuevos botones compuestos P2 Simplifique el código del widget existente Simplifique las colecciones de RemoteView P2 Simplifique el tiempo de ejecución de RemoteView P2
Recursos adicionales
Uso del color SysUI
(acento1 = A1, acento2 = A2, acento3 = A3, neutro1 = N1, neutro2 = N2)
Figura 4. Uso de colores dinámicos en la interfaz de usuario del sistema
Actualizaciones de atributos de color de la biblioteca de materiales
El material actualizará sus atributos de tema en la próxima versión mediante la creación de roles de color que se utilizan para proporcionar color a vistas específicas.
Rol de color | Atributo de tema de Android | Tema de luz Color dinámico | Tema oscuro Color dinámico |
---|---|---|---|
Primario | colorprimario | system_accent1_600 | system_accent1_200 |
en primaria | colorOnPrimary | system_accent1_0 | system_accent1_800 |
Secundario | colorsecundario | system_accent2_600 | system_accent2_200 |
en secundaria | colorOnSecundario | system_accent2_0 | system_accent2_800 |
Error | colorError | N/D (rojo_600) | N/D (rojo_200) |
en caso de error | colorOnError | N/D (blanco) | N/D (rojo_900) |
Fondo | Android: fondo de color | system_neutral1_10 | system_neutral1_900 |
en el fondo | color de fondo | system_neutral1_900 | system_neutral1_100 |
Superficie | colorSuperficie | system_neutral1_10 | system_neutral1_900 |
En la superficie | colorSobreSuperficie | system_neutral1_900 | system_neutral1_100 |
El material actualizará sus atributos de estado con los siguientes punteros:
Rol de color | Atributo de tema de Android | Tema de luz Color dinámico | Tema oscuro Color dinámico |
---|---|---|---|
Contenido de estado primario | colorPrimaryStateContent | system_accent1_700 | system_accent1_200 |
Capa de estado principal | colorPrimaryStateLayer | system_accent1_600 | system_accent1_300 |
Contenido estatal secundario | colorSecondaryStateContent | system_accent2_700 | system_accent2_200 |
Capa de estado secundaria | colorSecondaryStateLayer | system_accent2_600 | system_accent2_300 |
Sobre el contenido del estado primario | colorOnPrimaryStateContent | system_accent1_0 | system_accent1_800 |
En la capa de estado principal | colorOnPrimaryStateLayer | system_accent1_900 | system_accent1_800 |
Sobre el contenido estatal secundario | colorOnSecondaryStateContent | system_accent2_0 | system_accent2_800 |
En la capa de estado secundaria | colorOnSecondaryStateLayer | system_accent2_900 | system_accent2_800 |
Sobre el contenido del estado del contenedor principal | colorOnPrimaryContainerStateContent | system_accent1_900 | system_accent1_900 |
En la capa de estado del contenedor principal | colorOnPrimaryContainerStateLayer | system_accent1_900 | system_accent1_900 |
Sobre el contenido del estado del contenedor secundario | colorOnSecondaryContainerStateContent | system_accent2_900 | system_accent2_900 |
En la capa de estado del contenedor secundario | colorOnSecondaryContainerStateLayer | system_accent2_900 | system_accent2_900 |
Sobre el contenido del estado del contenedor terciario | colorOnTerciarioContenedorEstadoContenido | system_accent3_900 | system_accent3_900 |
En la capa de estado del contenedor terciario | colorOnTerciarioContenedorEstadoCapa | system_accent3_900 | system_accent3_900 |
En el contenido del estado de la superficie | colorOnSurfaceStateContent | system_neutral1_900 | system_neutral1_100 |
En la capa de estado de superficie | colorOnSurfaceStateLayer | system_neutral1_900 | system_neutral1_100 |
En contenido de estado de variante de superficie | colorOnSurfaceVariantStateContent | system_neutral2_700 | system_neutral2_200 |
En la capa de estado de variante de superficie | colorOnSurfaceVariantStateLayer | system_neutral2_700 | system_neutral2_200 |
Contenido del estado de error | colorErrorStateContent | rojo800 | rojo200 |
preguntas frecuentes
Extracción de color
Una vez que un usuario cambia un fondo de pantalla, ¿la extracción de color se realiza automáticamente o debe activarse desde algún lugar?
Con los parches de Android 12 , la extracción del color del fondo de pantalla está activada de forma predeterminada .
ThemeOverlayController.java
activa la lógica con ThemeOverlayController#mOnColorsChangedListener
y WallpaperManager#onWallpaperColorsChanged
.
Para Live Wallpapers o Video Wallpapers , ¿podríamos saber cuándo Color Extraction toma el color de la pantalla? Algunos usuarios pueden querer los colores del último cuadro ya que se muestra en la mayor parte del tiempo.
La extracción de color se activa cuando el usuario establece el fondo de pantalla o después de un ciclo de encendido de la pantalla (en respuesta a WallpaperEngine#notifyColorsChanged
). El último evento WallpaperColors
(del fondo de pantalla en vivo) se aplica después de que el usuario apaga la pantalla y la vuelve a encender.
Selector de tema/fondo de pantalla
¿Cómo habilito el selector de temas para que muestre múltiples colores de origen para que los usuarios elijan el color de mayor frecuencia? ¿Hay alguna manera de obtener esos colores de la lógica de extracción?
Sí. En su selector de temas, puede usar ColorScheme#getSeedColors(wallpaperColors: WallpaperColors)
.
Hay una función en los nombres de píxeles como icono temático . ¿Está incluido en los tres parches que habéis compartido? ¿Cómo pueden los OEM implementar eso?
No. Los íconos temáticos están en Beta y no están disponibles en Android 12.
¿Hay alguna forma de usar la aplicación Google Wallpaper con las funciones de extracción y selección de color habilitadas?
Sí. Las funciones se pueden implementar en la última versión de la aplicación Google Wallpaper siguiendo los pasos de integración descritos anteriormente en esta página.
Comuníquese con su TAM para obtener más detalles.
¿Puede Google compartir la aplicación o el código fuente para que los OEM puedan implementar su propia versión de la vista previa de color dinámica en su menú de configuración, que se parece a la sección de vista previa que se muestra en la aplicación de selección de papel tapiz de Google?
Las clases principales que representan la vista previa son WallpaperPicker2
y Launcher3
.
La pantalla de vista previa del fondo de pantalla es WallpaperSectionController
.
¿Cómo implementar la vista previa después de cambiar el color, como se muestra en la aplicación Google Wallpaper?
La aplicación del selector de fondos de pantalla espera que un ContentProvider
esté disponible desde el Lanzador (un lanzador basado en Launcher3
lo tiene). La vista previa la proporciona GridCustomizationsProvider
en Launcher, que debe estar referenciada en los metadatos de la actividad principal de Launcher para que la aplicación de estilo y fondo de pantalla pueda leerla. Todo esto está implementado en Launcher3 de AOSP y está disponible para los OEM.