Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
cairo学习笔记二(初级入门)
社区开发
2320
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
Featured Collection
Change
UOS AI 2.8 Released! Three New Intelligent Agents & Major Evolution
Solid Q&A | deepin 25 Common Questions – The Immutable System Edition
New Thread
Popular Events
More
一个字一个字显示
==================
膨胀
下面这个示例中,我们制造了一种膨胀的效果。这个示例显示了一串在膨胀的居中文本,并且伴有淡出现象。这是很常见的效果,在 flash 动画里经常见到。
在这一篇里,要讲述图像的处理。先是演示如何在 GTK+ 窗口中显示一幅图像,然后再制造一些特效。
图像的显示
在第一个例子里,显示了一幅图像。
百叶窗效果