Control alpha of all the children

Aron Barreira Bordin edited this page Jul 10, 2015 · 2 revisions
Clone this wiki locally

Summary

  • 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.

Usage

#!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)

Files

fbofloatlayout.py

#!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)

Comments

Add your comments here