当`text_size = self.size`时,如何在没有文本重新排序的情况下为字体大小设置动画

时间:2016-05-11 20:19:07

标签: python animation kivy font-size text-size

我需要显示一些文字,然后再设置动画字体大小。文本不得超过其小部件的大小,因此我使用text_size: self.size(我不介意在动画期间超出小部件大小的文本)

enter image description here

问题是字体大小的动画强制文本重新排序,这很丑陋(动画期间图像中的红色圆圈)

enter image description here

我希望 暂时超过这个尺寸。

如何实现不超过其小部件大小的文本,以及在字体大小的动画中超过该大小的文本(如下图所示)?

enter image description here

使用的代码:

from kivy.app import App
from kivy.uix.button import Button
from kivy.animation import Animation
from kivy.lang import Builder


kv = """
<MyWidget>:
    text: 'long text...' * 5
    text_size: self.size
    halign: 'center'
    valign: 'middle'
    on_release: self.animate_function()
"""


Builder.load_string(kv)


class MyWidget(Button):

    def animate_function(self):
        initial_font_size = self.font_size
        anim = Animation(font_size=initial_font_size * 1.5, duration=2)
        anim += Animation(font_size=initial_font_size, duration=2)
        anim.start(self)


class MyButtonsApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyButtonsApp().run()

2 个答案:

答案 0 :(得分:2)

您可以为文本的拉伸设置动画,而不是其字体大小。这将略微不那么图形精确(如放大小图像看起来模糊),但可能足够好,具体取决于您的参数。它也会很多更高性能;动画字体大小需要每次重新渲染纹理。

我有一个非常简单的使用Scale指令的例子,您可以找到here

答案 1 :(得分:0)

使用inclement建议的代码我最终得到以下代码,其行为与his answer中所述相同:

from kivy.app import App
from kivy.uix.button import Button
from kivy.animation import Animation
from kivy.lang import Builder
from kivy.properties import NumericProperty


kv = """
<MyWidget>:
    text: 'long text...' * 5
    text_size: self.size
    halign: 'center'
    valign: 'middle'
    on_release: self.animate_function()

    canvas.before:
        PushMatrix:
        Scale:
            origin: self.x + 0.5*self.width, self.y + 0.5*self.height
            x: self.scale
            y: self.scale

    canvas.after:
        PopMatrix:
"""


Builder.load_string(kv)


class MyWidget(Button):
    scale = NumericProperty(1)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.initial_scale = self.scale

    def animate_function(self):

        anim = Animation(scale=self.initial_scale * 1.2, duration=.1)
        anim += Animation(scale=self.initial_scale, duration=.1)
        anim.start(self)


class MyButtonsApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyButtonsApp().run()