用Python开发移动应用程序。在Kivy中创建动画。第2部分



向所有使用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_1lbl_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)


在下面的动画中,我演示了使用不同类型的动画创建的最简单动画的结果:



  1. in_out_back
  2. 外弹性
  3. 线性的




让我们使任务复杂一些,并尝试使标签在平面上的旋转动画化。为此,我们将使用矩阵操作(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中找到



All Articles