向所有使用Python编程语言的爱好者和专家致以问候!
今天,我们将继续处理动画在支持多点触控跨平台框架的主题- Kivy与结合谷歌材质设计组件库- KivyMD。在上一篇文章中,我们已经分析了Python / Kivy / KivyMD中一个测试应用程序的示例,在这一示例中,我们将更详细地讨论动画主题。在文章的结尾,我将提供一个指向项目存储库的链接,您可以在其中下载并亲自体验一个演示Kivy / KivyMD应用程序。与上一篇一样,本文将包含少量的GIF动画和视频,所以倒一些咖啡吧!
Kivy可在Linux,Windows,OS X,Android,iOS和Raspberry Pi上运行。您可以在所有受支持的平台上运行相同的代码,而无需对代码库进行任何其他更改。Kivy支持多种输入设备,包括WM_Touch,WM_Pen,Mac OS X触控板和Magic Mouse,Mtdev,Linux Kernel HID,TUIO,并且像Flutter一样,它不使用本机控件。它的所有小部件都是可定制的。这意味着Kivy应用在所有平台上看起来都是一样的。但是由于可以根据需要自定义Kivy小部件,因此可以创建自己的小部件。例如,这就是KivyMD库的出现方式。在继续之前,让我们看一下Kivy功能的一小部分概述:
Kivy应用程序演示
这些视频使用手势和动画清楚地演示了Kivy应用程序与用户的交互。让我们创建一个带有两个标签动画的简单应用程序:
from kivy.animation import Animation
from kivy.lang import Builder
from kivymd.app import MDApp
KV = """
<CommonLabel@MDLabel>
opacity: 0
adaptive_height: True
halign: "center"
y: -self.height
MDScreen:
on_touch_down: app.start_animation()
CommonLabel:
id: lbl_1
font_size: "32sp"
text: "M A R S"
CommonLabel:
id: lbl_2
font_size: "12sp"
text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
"""
class TestAnimation(MDApp):
def build(self):
return Builder.load_string(KV)
def start_animation(self):
lbl_1 = self.root.ids.lbl_1
lbl_2 = self.root.ids.lbl_2
Animation(
opacity=1, y=lbl_1.height * 2, d=0.9, t="in_out_back"
).start(lbl_1)
Animation(
opacity=1, y=lbl_2.height + ids.lbl_1.height, d=1, t="in_out_back"
).start(lbl_2)
TestAnimation().run()
这是一个现成的应用程序。我们将只对其进行少量编辑。KV行上的CommonLabel规则类似于在Python代码中创建一个类。相比:
Kivy语言中 的代码总是更短,更易读。因此,在Python代码中,我们只有逻辑。我们创建了两个具有CommonLabel规则描述的通用属性的标签:不透明度,标签纹理大小(adaptive_height),水平对齐方式(halign),Y轴位置(y),并赋予了这些标签id-shniki(lbl_1,lbl_2)以便能够从Python代码访问和操作标签对象的属性。接下来,我们将start_animation方法调用附加到on_touch_down事件(在触摸屏幕的任何位置时触发)在其中我们将为两个标签制作动画。
动画
Kivy使用Animation类为对象设置动画。使用它非常简单:初始化Animation类时,必须传递带有目标值的属性名称,该目标值将在动画末尾作为参数传递给目标名称。例如:
def start_animation(self):
# KV
lbl_1 = self.root.ids.lbl_1
lbl_2 = self.root.ids.lbl_2
#
Animation(
opacity=1, # 1
y=lbl_1.height * 2, # Y
d=0.9, #
t="in_out_back" #
).start(lbl_1) # start ,
#
Animation(
opacity=1, y=lbl_2.height + lbl_1.height, d=1, t="in_out_back"
).start(lbl_2)
在下面的动画中,我演示了使用不同类型的动画创建的最简单动画的结果:
让我们使任务复杂一些,并尝试使标签在平面上的旋转动画化。为此,我们将使用矩阵操作(PushMatrix,PopMatrix,Rotate,Translate,Scale)。将画布声明添加到共享标签:
<CommonLabel@MDLabel>
angle: 180 #
[...]
canvas.before:
PushMatrix
Rotate:
angle: self.angle
origin: self.center
canvas.after:
PopMatrix
在Python代码中,我们将动画的新angle属性传递给Animation类:
def start_animation(self):
lbl_1 = self.root.ids.lbl_1
lbl_2 = self.root.ids.lbl_2
Animation(angle=0, [...]).start(lbl_1)
Animation(angle=0, [...]).start(lbl_2)
结果:
让我们添加标签比例的动画:
<CommonLabel@MDLabel>
scale: 5 #
[...]
canvas.before:
PushMatrix
[...]
Scale:
#
x: self.scale
y: self.scale
z: self.scale
origin: self.center
canvas.after:
PopMatrix
在Python代码中,我们会将用于动画的新的scale属性传递给Animation类:
def start_animation(self):
lbl_1 = self.root.ids.lbl_1
lbl_2 = self.root.ids.lbl_2
Animation(scale=1, [...]).start(lbl_1)
Animation(scale=1, [...]).start(lbl_2)
结果:
Animation 类具有许多跟踪动画过程的事件:on_start,on_progress,on_complete。考虑后者。动画处理完成时,将调用on_complete。让我们将此事件绑定到我们现在将创建的complete_animation方法:
[...]
class TestAnimation(MDApp):
[...]
def complete_animation(self, animation, animated_instance):
"""
:type animation: <kivy.animation.Animation object>
:type animated_instance: <WeakProxy to <kivy.factory.CommonLabel object>>
"""
# .
Animation(scale=1.4, d=1, t="in_out_back").start(animated_instance)
Animation(color=(1, 0, 1, 1), d=1).start(animated_instance)
我们绑定事件:
def start_animation(self):
[...]
animation = Animation(
angle=0, scale=1, opacity=1, y=lbl_1.height * 2, d=0.9, t="in_out_back"
)
animation.bind(on_complete=self.complete_animation)
animation.start(lbl_1)
[....]
结果:
目前为止就这样了。问:
下面,我附有Kivy / KivyMD项目的预览图,以及指向存储库的链接,您可以在其中下载APK并触摸:
→ APK存储库
可在存储库目录-StarTest / bin中找到