Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
clutter学习笔记四----Timeline 时间线的使用
社区开发
1922
views ·
0
replies ·
To
floor
Go
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。
=====================================================================================
例子:
# coding:utf-8
import clutter
class App:
def __init__ (self):
self.alpha = 0x99
self.tag = 1
self.step = 0
self.stage_color = clutter.Color(0x00, 0x00, 0x00, 0xff)
self.actor_color = clutter.Color(0xff, 0xff, 0xff, self.alpha)
self.stage = clutter.Stage()
self.stage.set_size(400, 500)
self.stage.set_color(self.stage_color)
self.stage.connect("destroy", clutter.main_quit)
self.rect = clutter.Texture("linux.png")
self.rect.set_size(70, 70)
self.rect.set_position(150,150)
self.stage.add(self.rect)
clutter.Actor.show(self.rect)
clutter.Actor.show(self.stage)
self.timeline = clutter.Timeline(8000)
self.timeline.add_marker_at_time("my-mark", 8000)
self.timeline.connect("new-frame", self.on_timeline_new_frame)
self.timeline.connect("marker-reached", self.on_timeline_marker_reached)
self.timeline.set_loop(True)
self.timeline.start()
#刷屏触发函数
def on_timeline_new_frame(self, timeline, frame_num):
self.step -= 1.0
if self.step < 360:
step = 0
self.rect.set_rotation(clutter.Y_AXIS, self.step, 80, 0, 80)
#自定义函数触发函数
def on_timeline_marker_reached(self, timeline, marker_name, data):
print "dsfdsfdsf"
if __name__ == "__main__":
app = App()
clutter.main()
Copy the Code
=======================================================================================
Reply
Like 0
Favorite
View the author
All Replies
No replies yet
Please
sign
in first
New Thread
Popular Ranking
Change
如何安装软件安装包?
Instructions on How to change the language in Thunderbird
EZVIZ on Linux
Popular Events
More
动画的基础和控制端;
定义了动画的帧率;
每一帧都能够处理回调函数;
播放、暂停、停止、跳帧、回放、循环
============================================
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。
=====================================================================================
例子: