Kivy 简明教程
Kivy - Animation
对窗口小部件应用动画效果是 Kivy 框架最吸引人的功能之一。在 Kivy 中,动画功能在包含在 kivy.animation 模块中的 Animation 类中进行定义。同一个模块还包括 AnimationTransition 类。它是应用动画过渡效果的函数集合。
为了使用动画效果,Kivy 应用程序应该 -
-
首先决定对哪个窗口小部件的属性进行动画处理,
-
设置 Animation 类的对象,
-
设置属性的最终值,
-
调用 Animation 对象的 start() 方法,并将窗口小部件作为参数传递。
要对窗口小部件的 x 或 y 位置进行动画处理,只需指定你要在动画结束时对窗口小部件进行定位的目标 x/y 值即可 -
rom kivy.animation import Animation
anim = Animation(x=100, y=100)
anim.start(widget)
这将对窗口小部件的 x 和 y 位置进行动画处理,使其从其原始位置移动到 100,100,默认持续时间为一秒。
你可以要求对多个属性进行动画处理。例如,若要对位置和大小进行动画处理,请使用 -
anim = Animation(x=50, size=(80, 80))
anim.start(widget)
你还可以指定 Animation 对象的转换 (或 t) 属性以应用转换效果。
在两个 Animation 对象之间使用 '+' 运算符会按顺序合并动画。
anim = Animation(x=50) + Animation(size=(80, 80), duration=2)
这会将小部件在 1 秒内移动到 x=50,然后在接下来的两秒内将大小移动到 (80, 80)。
另一方面,“&”运算符并行连接动画。以下示例将在 1 秒内同时执行位置到 (80, 10) 的动画,大小到 (800, 800) −
anim = Animation(pos=(80, 10))
anim &= Animation(size=(800, 800), duration=2.)
如果程序正在实现“序列”动画,可以通过将 anim.repeat 设置为 True 来将动画设置为循环播放。
Animation 类具有以下属性和方法 −
-
duration or d − 动画持续时间(以秒为单位),默认为 1。
-
transition or t − 动画属性的过渡函数。它可以是 AnimationTransition 中方法的名称。
-
step or s − float。动画的毫秒步长。默认为 0,这意味着动画会针对每帧进行更新。如果你想以 30 FPS 进行动画,请使用 s=1/30。
-
cancel() − 取消先前应用到小部件的动画。
-
cancel_all() − 取消所有涉及特定小部件/属性列表的动画。
-
start() − 开始针对小部件执行动画。
-
stop() − 停止先前应用到小部件的动画,触发 on_complete 事件。
-
stop_all() − 停止所有涉及特定小部件/属性列表的动画。
Example
在以下“kv”脚本的帮助下,将按钮和标签放置在垂直框布局中。该按钮绑定到 animating() 方法。
<MyLayout>
BoxLayout:
orientation: "vertical"
size: root.width, root.height
padding: 50
spacing: 20
Label:
id: my_label
text: "Hello World!"
font_size: 32
Button:
text: "Start"
font_size: 32
size_hint: .5, .5
pos_hint: {"center_x": 0.5}
on_release: root.animating(self)
此“kv”脚本加载到 App 类中。当单击按钮时,animating() 方法对按钮应用位置、背景颜色和大小动画效果。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.animation import Animation
from kivy.core.window import Window
Window.size = (720, 400)
class MyLayout(Widget):
def animating(self, widget, *args):
animate = Animation(
pos=(widget.pos[0], Window.height - 50)
)
animate += Animation(pos=(widget.pos[0], 0))
animate += Animation(
background_color=(0, 0, 1, 1),
duration=1
)
animate += Animation(size_hint=(1, 1))
animate += Animation(size_hint=(.5, .5))
animate += Animation(pos_hint={"center_x": 0.1})
animate += Animation(pos_hint={"center_x": 0.5})
animate.start(widget)
# Create a callback
animate.bind(on_complete=self.my_callback)
def my_callback(self, *args):
self.ids.my_label.text = "Hello Kivy"
class AwesomeApp(App):
def build(self):
return MyLayout()
if __name__ == '__main__':
AwesomeApp().run()