Dynamic color#
#
See also
Dynamic color can create accessible UI color schemes based on content or user settings
Dynamic color experiences are built with M3 color schemes. Beginning with Android 12, users can generate individualized schemes through wallpaper selection and other customization settings. With M3 as a foundation, user-generated colors can coexist with app colors, putting a range of customizable visual experiences in the hands of users.
Baseline scheme
Colors extracted from a wallpaper
Colors extracted from content
Example of dynamic color from the list of standard color schemes#
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty, ColorProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.utils import hex_colormap
from kivymd.uix.menu import MDDropdownMenu
from kivymd.app import MDApp
KV = '''
<ColorCard>
orientation: "vertical"
MDLabel:
text: root.text
color: "grey"
adaptive_height: True
MDCard:
theme_bg_color: "Custom"
md_bg_color: root.bg_color
MDScreen:
md_bg_color: app.theme_cls.backgroundColor
MDIconButton:
on_release: app.open_menu(self)
pos_hint: {"top": .98}
x: "12dp"
icon: "menu"
MDRecycleView:
id: card_list
viewclass: "ColorCard"
bar_width: 0
size_hint_y: None
height: root.height - dp(68)
RecycleGridLayout:
cols: 3
spacing: "16dp"
padding: "16dp"
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
'''
class ColorCard(BoxLayout):
text = StringProperty()
bg_color = ColorProperty()
class Example(MDApp):
menu: MDDropdownMenu = None
def build(self):
self.theme_cls.dynamic_color = True
return Builder.load_string(KV)
def get_instance_from_menu(self, name_item):
index = 0
rv = self.menu.ids.md_menu
opts = rv.layout_manager.view_opts
datas = rv.data[0]
for data in rv.data:
if data["text"] == name_item:
index = rv.data.index(data)
break
instance = rv.view_adapter.get_view(
index, datas, opts[index]["viewclass"]
)
return instance
def open_menu(self, menu_button):
menu_items = []
for item, method in {
"Set palette": lambda: self.set_palette(),
"Switch theme style": lambda: self.theme_switch(),
}.items():
menu_items.append({"text": item, "on_release": method})
self.menu = MDDropdownMenu(
caller=menu_button,
items=menu_items,
)
self.menu.open()
def set_palette(self):
instance_from_menu = self.get_instance_from_menu("Set palette")
available_palettes = [
name_color.capitalize() for name_color in hex_colormap.keys()
]
menu_items = []
for name_palette in available_palettes:
menu_items.append(
{
"text": name_palette,
"on_release": lambda x=name_palette: self.switch_palette(x),
}
)
MDDropdownMenu(
caller=instance_from_menu,
items=menu_items,
).open()
def switch_palette(self, selected_palette):
self.theme_cls.primary_palette = selected_palette
Clock.schedule_once(self.generate_cards, 0.5)
def theme_switch(self) -> None:
self.theme_cls.switch_theme()
Clock.schedule_once(self.generate_cards, 0.5)
def generate_cards(self, *args):
self.root.ids.card_list.data = []
for color in self.theme_cls.dynamic_color_names:
self.root.ids.card_list.data.append(
{
"bg_color": getattr(self.theme_cls, color),
"text": color,
}
)
def on_start(self):
Clock.schedule_once(self.generate_cards)
Example().run()
Example of a dynamic color from an image#
import os
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.core.window.window_sdl2 import WindowSDL
from kivy.lang import Builder
from kivy.properties import StringProperty, ColorProperty
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.app import MDApp
KV = '''
<ColorCard>
orientation: "vertical"
MDLabel:
text: root.text
color: "grey"
adaptive_height: True
MDCard:
theme_bg_color: "Custom"
md_bg_color: root.bg_color
MDScreen:
md_bg_color: app.theme_cls.backgroundColor
MDRecycleView:
id: card_list
viewclass: "ColorCard"
bar_width: 0
RecycleGridLayout:
cols: 3
spacing: "16dp"
padding: "16dp"
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
'''
class ColorCard(MDBoxLayout):
text = StringProperty()
bg_color = ColorProperty()
class Example(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
Window.bind(on_dropfile=self.on_drop_file)
def on_drop_file(self, sdl: WindowSDL, path_to_file: str) -> None:
ext = os.path.splitext(path_to_file)[1]
if isinstance(path_to_file, bytes):
path_to_file = path_to_file.decode()
if isinstance(ext, bytes):
ext = ext.decode()
if ext in [".png", ".jpg"]:
self.theme_cls.path_to_wallpaper = path_to_file
Clock.schedule_once(self.generate_cards, 0.5)
def build(self):
self.theme_cls.dynamic_color = True
self.theme_cls.theme_style = "Dark"
return Builder.load_string(KV)
def theme_switch(self) -> None:
self.theme_cls.switch_theme()
Clock.schedule_once(self.generate_cards, 0.5)
def generate_cards(self, *args):
self.root.ids.card_list.data = []
for color in self.theme_cls.dynamic_color_names:
self.root.ids.card_list.data.append(
{
"bg_color": getattr(self.theme_cls, color),
"text": color,
}
)
def on_start(self):
Clock.schedule_once(self.generate_cards)
Example().run()
API - kivymd.dynamic_color#
- class kivymd.dynamic_color.DynamicColor#
Dynamic color class.
Added in version 2.0.0.
- primaryColor#
Primary color.
primaryColoris anColorPropertyand defaults to None.
- primaryContainerColor#
Primary container color.
primaryContainerColoris anColorPropertyand defaults to None.
- onPrimaryColor#
On primary color.
onPrimaryColoris anColorPropertyand defaults to None.
- onPrimaryContainerColor#
On primary container color.
onPrimaryContainerColoris anColorPropertyand defaults to None.
- secondaryColor#
Secondary color.
secondaryColoris anColorPropertyand defaults to None.
- secondaryContainerColor#
Secondary container color.
secondaryContainerColoris anColorPropertyand defaults to None.
- onSecondaryColor#
On secondary color.
onSecondaryColoris anColorPropertyand defaults to None.
- onSecondaryContainerColor#
On secondary container color.
onSecondaryContainerColoris anColorPropertyand defaults to None.
- tertiaryColor#
Tertiary color.
tertiaryColoris anColorPropertyand defaults to None.
- tertiaryContainerColor#
Tertiary container color.
tertiaryContainerColoris anColorPropertyand defaults to None.
- onTertiaryColor#
On tertiary color.
onTertiaryColoris anColorPropertyand defaults to None.
- onTertiaryContainerColor#
On tertiary container color.
onTertiaryContainerColoris anColorPropertyand defaults to None.
- surfaceColor#
Surface color.
surfaceColoris anColorPropertyand defaults to None.
- surfaceDimColor#
Surface dim color.
surfaceDimColoris anColorPropertyand defaults to None.
- surfaceBrightColor#
Surface bright color.
surfaceBrightColoris anColorPropertyand defaults to None.
- surfaceContainerLowestColor#
Surface container lowest color.
surfaceContainerLowestColoris anColorPropertyand defaults to None.
- surfaceContainerLowColor#
Surface container low color.
surfaceContainerLowColoris anColorPropertyand defaults to None.
- surfaceContainerColor#
Surface container color.
surfaceContainerColoris anColorPropertyand defaults to None.
- surfaceContainerHighColor#
Surface container high color.
surfaceContainerHighColoris anColorPropertyand defaults to None.
- surfaceContainerHighestColor#
Surface container highest color.
surfaceContainerHighestColoris anColorPropertyand defaults to None.
- surfaceVariantColor#
Surface variant color.
surfaceVariantColoris anColorPropertyand defaults to None.
- surfaceTintColor#
Surface tint color.
surfaceTintColoris anColorPropertyand defaults to None.
- onSurfaceColor#
On surface color.
onSurfaceColoris anColorPropertyand defaults to None.
- onSurfaceLightColor#
On surface light color.
onSurfaceLightColoris anColorPropertyand defaults to None.
- onSurfaceVariantColor#
On surface variant color.
onSurfaceVariantColoris anColorPropertyand defaults to None.
- inverseSurfaceColor#
Inverse surface color.
inverseSurfaceColoris anColorPropertyand defaults to None.
- inverseOnSurfaceColor#
Inverse on surface color.
inverseOnSurfaceColoris anColorPropertyand defaults to None.
- inversePrimaryColor#
Inverse primary color.
inversePrimaryColoris anColorPropertyand defaults to None.
- backgroundColor#
Background color.
backgroundColoris anColorPropertyand defaults to None.
- onBackgroundColor#
On background color.
onBackgroundColoris anColorPropertyand defaults to None.
- errorColor#
Error color.
errorColoris anColorPropertyand defaults to None.
- errorContainerColor#
Error container color.
errorContainerColoris anColorPropertyand defaults to None.
- onErrorColor#
On error color.
onErrorColoris anColorPropertyand defaults to None.
- onErrorContainerColor#
On error container color.
onErrorContainerColoris anColorPropertyand defaults to None.
- outlineColor#
Outline color.
outlineColoris anColorPropertyand defaults to None.
- outlineVariantColor#
Outline variant color.
outlineVariantColoris anColorPropertyand defaults to None.
- shadowColor#
Shadow color.
shadowColoris anColorPropertyand defaults to None.
- scrimColor#
Scrim color.
scrimColoris anColorPropertyand defaults to None.
- disabledTextColor#
Disabled text color.
disabledTextColoris anColorPropertyand defaults to None.
- transparentColor#
Transparent color.
transparentColoris anColorPropertyand defaults to [0, 0, 0, 0].
- rippleColor#
Ripple color.
rippleColoris anColorPropertyand defaults to ‘#BDBDBD’.