Control alpha of all the children
Clone this wiki locally
- author: Mathieu Virbel
- kivy: >= 1.0.7
The idea of this snippet is to control the alpha of all children. You cannot set a color or global alpha. So the idea is to draw all the children in a Framebuffer, and draw this framebuffer with a custom color.
Note: One can use
opacity property of a Widget since 1.4.1
We are making this widget in top of FloatLayout.
#!python from fbofloatlayout import FboFloatLayout layout = FboFloatLayout() # add here your own widget like: # layout.add_widget(Button(text='hello world')) # hide every widgets layout.alpha = 0 # show all widgets with alpha = 50% layout.alpha = 0.5 # you can even animate it from kivy.animation import Animation Animation(alpha=1.0).start(layout)
#!python __all__ = ('FboFloatLayout', ) # needed to create Fbo, must be resolved in future kivy version from kivy.core.window import Window from kivy.graphics import Color, Rectangle, Canvas from kivy.graphics.fbo import Fbo from kivy.uix.floatlayout import FloatLayout from kivy.properties import ObjectProperty, NumericProperty class FboFloatLayout(FloatLayout): texture = ObjectProperty(None, allownone=True) alpha = NumericProperty(1) def __init__(self, **kwargs): self.canvas = Canvas() with self.canvas: self.fbo = Fbo(size=self.size) self.fbo_color = Color(1, 1, 1, 1) self.fbo_rect = Rectangle() # wait that all the instructions are in the canvas to set texture self.texture = self.fbo.texture super(FboFloatLayout, self).__init__(**kwargs) def add_widget(self, *largs): # trick to attach graphics instructino to fbo instead of canvas canvas = self.canvas self.canvas = self.fbo ret = super(FboFloatLayout, self).add_widget(*largs) self.canvas = canvas return ret def remove_widget(self, *largs): canvas = self.canvas self.canvas = self.fbo super(FboFloatLayout, self).remove_widget(*largs) self.canvas = canvas def on_size(self, instance, value): self.fbo.size = value self.texture = self.fbo.texture self.fbo_rect.size = value def on_pos(self, instance, value): self.fbo_rect.pos = value def on_texture(self, instance, value): self.fbo_rect.texture = value def on_alpha(self, instance, value): self.fbo_color.rgba = (1, 1, 1, value)
Add your comments here