Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
cairo学习笔记二(初级入门)
社区开发
2287
views ·
0
replies ·
To
floor
Go
z85525006
deepin
2012-02-20 06:00
Author
歌词显示
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#本篇讲述如何处理文本。
#老男孩
#第一个示例是在 GTK+ 窗口中显示《老男孩》的部分歌词。
#原作者: http://liyanrui.is-programmer.com/2010/4/7/cairo-text.16643.html
class App(object):
def __init__(self):
#抛砖引玉,歌词就靠你发挥了.
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("老男孩歌词显示")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
self.angle = 0
self.scale = 1
self.delta = 0.01
window.set_opacity(0.9)
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0.1, 0.1, 0.1)
cr.select_font_face("Purisa",
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_BOLD)
#这里设置字体。这个函数接受了三个字体参数的传入,字体的名称(倾斜)、样式与轻重
cr.set_font_size(23)
cr.move_to(20, 30)
cr.set_source_rgb(1,0,0)
cr.show_text("那")
cr.set_source_rgb(0, 0, 0)
cr.move_to(45,30)
cr.show_text("是我日夜思念深深爱着的人啊")
cr.move_to(20, 60)
cr.show_text("到底我该如何表达 她会接受我吗")
cr.move_to(20, 90)
cr.set_source_rgb(1, 0,0)
cr.show_text("也许永远都不会跟她说出那句")
cr.set_source_rgb(1,1,1)
cr.move_to(22,90)
cr.show_text("也许永远都不会跟她说出那句话")
return True
App()
gtk.main()
Copy the Code
一个字一个字显示
#!/usr/bin/env python
# coding:utf-8
#邱海龙就是一个菜鸟,垃圾.滚吧...
import cairo
import gtk
text = ["L", "i", "n", "u", "x", "d", "e"]
timer = True
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("一个字接一个字... ...")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
gtk.timeout_add(1000, self.time_handler, window)
self.count = 0
window.set_app_paintable(True)
window.show_all()
def time_handler(self, widget):
widget.queue_draw()
if not timer: return False
return True
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.select_font_face("Courier",
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_BOLD)
cr.set_font_size(35)
cr.set_source_rgb(0.2, 0.2, 0.2)
self.x = 0
for i in range(0,self.count):
extents = cr.text_extents(text[i])
print extents
width = extents[2]
width += 2
self.x += width
cr.move_to(self.x+30, 50)
cr.show_text(text[i])
self.count += 1
if self.count == 8:
timer = False
self.count = 0
return True
App()
gtk.main()
Copy the Code
将上面一个个字显示和上面的例子合体,就能实现那样的 歌词 动过去的....
==================
膨胀
下面这个示例中,我们制造了一种膨胀的效果。这个示例显示了一串在膨胀的居中文本,并且伴有淡出现象。这是很常见的效果,在 flash 动画里经常见到。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
text = ["z", "e", "t", "c", "o", "d", "e"]
timer = True
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("字体膨胀效果")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
self.alpha = 1.0
self.size = 1
gtk.timeout_add(14, self.time_handler, window)
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
#获取窗口中心坐标
x = widget.allocation.width /2
y = widget.allocation.height /2
cr.set_source_rgb(0.5, 0, 0)
cr.paint()
#将背景设为暗红色
cr.select_font_face("Courier",
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_BOLD)
self.size += 0.8#每论循环,字号增长0.8个单位
if self.size > 20:
self.alpha -= 0.01
cr.set_font_size(self.size)
cr.set_source_rgb(1, 1, 1)
extents = cr.text_extents("ZetCode")
cr.move_to(x-extents[2]/2, y)
#获取文本的路径,并将其设为当前的裁剪域
cr.text_path("ZetCode")
cr.clip()
#绘制当前的路径,添加alpha值,谈出效果
cr.stroke()
cr.paint_with_alpha(self.alpha)
if self.alpha <= 0:
self.alpha = 1.0
self.size = 1
return True
def time_handler(self, widget):
if not timer:
return False
widget.queue_draw()
return True
App()
gtk.main()
Copy the Code
在这一篇里,要讲述图像的处理。先是演示如何在 GTK+ 窗口中显示一幅图像,然后再制造一些特效。
图像的显示
在第一个例子里,显示了一幅图像。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("图形的显示")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
self.image = cairo.ImageSurface.create_from_png("linuxdeepin.png")
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_surface(self.image, 10, 10)
cr.paint()
return True
App()
gtk.main()
Copy the Code
[/code]linuxdeepin.png
======================================================
垂帘效果(Blind Down)
在下面的代码示例中,要垂帘显示图片,就像拉下窗帘的那种效果。
[code]
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
timer = True
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("垂帘效果")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
#图片
self.image = cairo.ImageSurface.create_from_png("linuxdeepin.png")
gtk.timeout_add(15, self.time_handler, window)
self.angle = 0
self.image_width = 0
self.image_height = 0
self.w = 0
self.h = 0
window.set_default_size(300, 300)
window.connect("destroy",
lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
width, height = widget.get_size()
self.image_width = self.image.get_width()
self.image_height = self.image.get_height()
self.w = self.image_width
#创建一个图像外观,并通过它构造那个于图形相关联的cairo环境
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
self.image_width,
self.image_height)
ic = cairo.Context(surface)
#在初始的空图形中绘制一个矩形,它在循环显示h+1,
#采用这种方式创建的图像在后面要作为蒙板来用
ic.rectangle(0, 0, self.w, self.h)
ic.fill()
self.h += 1
#slef.h和图片高度相等的时候,呵呵呵呵,你知道的.
if self.h == self.image_height:
self.h = 1
#timer = False
#深度图片被设置为要绘制的源,并采用surface的alpha通道作为
#蒙板来绘制这个源
cr.set_source_surface(self.image, 10, 10)
cr.mask_surface(surface, 10, 10)
# cr,ic
# 声明两个 cairo环境, 一个与gtkWindow相关联,另一个和图片相关联
#蒙板 就是在Linux图标在撒上一层细沙
#细沙把底图遮盖住,它就相当于蒙版
#如果你想把底图的一部分显现出来,就可以用手指(相当于使用蒙版时的画笔,且前景为黑)把细沙划去一些,如果想再把显出来的一部分盖住则又可以在上面撒上一层沙子(相当于前景色设为白色,用画笔涂沫)t
return True
def time_handler(self, widget):
if not timer:
return False
widget.queue_draw()
return True
App()
gtk.main()
Copy the Code
百叶窗效果
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
timer = True
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("百叶窗口")
window.set_app_paintable(True)
#图片
self.image = cairo.ImageSurface.create_from_png("linuxdeepin.png")
gtk.timeout_add(400, self.time_handler, window)
self.angle = 0
self.image_width = 0
self.image_height = 0
self.w = 0
self.h = 0
self.count = 0
window.set_default_size(300, 300)
window.connect("destroy",
lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
window.show_all()
#百叶窗口
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
width, height = widget.get_size()
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
self.image_width,
self.image_height)
self.image_width = self.image.get_width()
self.image_height =self.image.get_height()
self.w = self.image_width
ic = cairo.Context(surface)
for i in range(0, self.image_height+1,7):
for j in range(0, self.count):
ic.move_to(0, i+j)
ic.line_to(self.w, i+j)
ic.stroke()
self.count += 1
if self.count == 8: self.count = 0
cr.set_source_surface(self.image, 10, 10)
cr.mask_surface(surface, 10, 10)
#这个 百叶原理很简单.
# 就是在蒙板上 每间隔 7 ,就从0 到 图片宽度.高度是i+j.
#然后每400毫秒 就加1,慢慢的就形成了 百叶效果t
return True
def time_handler(self, widget):
if not timer:
return False
widget.queue_draw()
return True
App()
gtk.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
keyring deepin password.. WTF... Not user friendly
UNABLE TO SYNC IN BRAZIL
Popular Events
More
一个字一个字显示
==================
膨胀
下面这个示例中,我们制造了一种膨胀的效果。这个示例显示了一串在膨胀的居中文本,并且伴有淡出现象。这是很常见的效果,在 flash 动画里经常见到。
在这一篇里,要讲述图像的处理。先是演示如何在 GTK+ 窗口中显示一幅图像,然后再制造一些特效。
图像的显示
在第一个例子里,显示了一幅图像。
百叶窗效果