clutter学习笔记四----Timeline 时间线的使用
Tofloor
poster avatar
z85525006
deepin
2012-02-05 21:00
Author
时间轴 ClutterTimeline
                        动画的基础和控制端;
                        定义了动画的帧率;
                        每一帧都能够处理回调函数;
                        播放、暂停、停止、跳帧、回放、循环
============================================

ClutterTimeline 可以让 actor 随着时间改变位置和外形,它可以单独使用,也可以与后面讲的 effect 和 behaviour 一起使用。
针对每一个新帧,时间线对象对象 new-frame 信号,在信号处理函数中可以设置 actor 的属性。例如,actor 可以随着时间的变化移动、旋转,并改变颜色,你甚至可以同时改变 stage 中几个 actor 的性形成属动画。
clutter.Timeline(num_frames=True, fps=True, duration=True) 用于初始化时间线,它的参数是动画的总帧数和每秒的帧数,所以整个时间线持续的时间是总帧数/每秒钟帧数。
因此你可以根据期望的动画时间来选择总帧数和每秒帧数。
重复动画,直到调用也可以用clutter.timeline.set_loop()  clutter.timeline.stop()为止。时间线不会开始,除非调用clutter.timeline.start()。
注意时间线结束后,别忘了 unref 时间线。与 actor 不同, 时间线不是 "floating reference",你或者在 mainloop 之后 unref,或者在时间线完成后通过处理时间线完成信号来 unref 时间线。
==========================================================


使用方法如下:
一、创建一个 CLutterTimeline 的类型,clutter.timeline
二、设置监测事件。
三、启动 clutter.timeline.start(),停止 clutter.timeline.stop(),循环 clutter.timeline.set_loop()
    我觉得 ClutterTimeline 是个很好的类型,会在 Clutter 项目中经常使用。
他提供了两种触发机制。
第一种是“newframe”,在其他的图形开发中,如果我们需要动态处理图像变化,可能需要一个 timeout 时间,在这个时间到了的时间,redraw 画面,Clutter 提供了很特别的一种方式,在屏幕帧刷新的时候触发“newframe”事件。
需要注意的是,不同 monitor,刷新频率是不一样的,newframe 的触发不同机器的时间间隔是不一样的,如果需要
各类机器获得同样的效果,需要加上 timestampe 了进行计算,无论如何,可以使图像在最小的颗粒度内进行重画,已达到最佳的平滑效果。
     另一个是我们自行定义的 marker-reached,这是基于时间触发的。
下面的图说明 ClutterTimeline 的触发机制。
ghj.png
在创建 ClutterTimeline,我定义时间为 T0,也就是 T0 时间为一个 timeout 时间,如果我们通过 clutter.timeline.set_loop()定义循环,那么在 T0 结束后开启一个新的 T0 时间片,知道程序结束或者通过 clutter.timeline_stop()来结束循环。我们可以在每个时间片中,通过 clutter.timeline.add_marker_at_time,设置 timeout 时钟,触发事件为 marker-reached。
=====================================================================================
例子:
  1. # coding:utf-8
  2. import clutter
  3. class App:
  4.     def __init__ (self):
  5.         self.alpha       = 0x99
  6.         self.tag         = 1
  7.         self.step        = 0
  8.         self.stage_color = clutter.Color(0x00, 0x00, 0x00, 0xff)
  9.         self.actor_color = clutter.Color(0xff, 0xff, 0xff, self.alpha)
  10.         self.stage = clutter.Stage()
  11.         self.stage.set_size(400, 500)
  12.         self.stage.set_color(self.stage_color)
  13.         self.stage.connect("destroy", clutter.main_quit)
  14.         
  15.         self.rect = clutter.Texture("linux.png")
  16.         self.rect.set_size(70, 70)
  17.         self.rect.set_position(150,150)
  18.         self.stage.add(self.rect)
  19.         clutter.Actor.show(self.rect)
  20.         clutter.Actor.show(self.stage)
  21.         
  22.         self.timeline = clutter.Timeline(8000)
  23.         self.timeline.add_marker_at_time("my-mark", 8000)
  24.         self.timeline.connect("new-frame", self.on_timeline_new_frame)
  25.         self.timeline.connect("marker-reached", self.on_timeline_marker_reached)
  26.         self.timeline.set_loop(True)
  27.         self.timeline.start()
  28.    
  29.     #刷屏触发函数   
  30.     def on_timeline_new_frame(self, timeline, frame_num):
  31.         
  32.         self.step -= 1.0
  33.         if self.step < 360:
  34.             step = 0
  35.         
  36.         self.rect.set_rotation(clutter.Y_AXIS, self.step, 80, 0, 80)
  37.                
  38.     #自定义函数触发函数
  39.     def on_timeline_marker_reached(self, timeline, marker_name, data):
  40.         print "dsfdsfdsf"
  41.         
  42.         
  43. if __name__ == "__main__":
  44.     app = App()
  45.     clutter.main()
Copy the Code
=======================================================================================
Reply Favorite View the author
All Replies

No replies yet