使用Moblin開發應用程式 -- Clutter之Actor與Stage

Nikey001發表於2009-05-12

微軟Surface推出後,其中的圖片與視訊瀏覽器讓人留下了比較深刻的印象。藉著學習clutter的機會,我就打算做一個類似的圖片瀏覽器。逛了clutter的網站後發現,clutter居然有python binding,於是決定使用pyclutter進行程式的開發。

第一個demo很簡單:將一堆照片隨意放在桌面上。J

這次會接觸到2個有關clutter的概念:ActorStageActorStage,顧名思義,演員與舞臺。沒錯,從本質上講,clutter就是讓一群2維的Actor3維的Stage上表演。ClutterActor是所有Actor的父類,它是一個抽象類,提供一些Actor的通用的操作,如位移、旋轉、縮放等。使用者在程式設計中可以繼承ClutterActor以開發自定義的Actor,也可以使用Clutter現有的一些Actor,如ClutterRectangleClutterTextureClutterCloneTextureClutterLabelClutterEntry等。同時,Clutter中也有些容器類,如ClutterStageClutterGroup,它們也是ClutterActor的子類。

在這個demo中,我們將會用到ClutterStageClutterGroupClutterRectangleClutterTextureDemo的原始碼如下:

#!/usr/bin/python

 

import sys

import os

import random

 

import clutter

 

STAGE_WIDTH=1024

STAGE_HEIGHT=768

 

class Photo:

  border_width = 10

 

       def __init__(self, path, stage):

              self.stage = stage

              self.path = path

              self.x = 0

              self.y = 0

              self.degree = 0

 

              self.pic = clutter.Texture()

              self.pic.set_from_file(path)

              self.width = self.pic.get_width()+2*Photo.border_width

              self.height = self.pic.get_height()+2*Photo.border_width            

             

              self.frame. = clutter.Rectangle()

              self.frame.set_color(clutter.Color(0xff, 0xff, 0xff, 0xff))

              self.frame.set_position(self.x, self.y)

              self.frame.set_size(self.width, self.height)

 

              self.group = clutter.Group()

              self.group.add(self.frame)

              self.group.add(self.pic)

              self.pic.set_position(PHOTO_BORDER_WIDTH, PHOTO_BORDER_WIDTH)

             

              self.stage.add(self.group)    

             

 

       def set_random_position(self):

              stage_width = self.stage.get_width()

              stage_height = self.stage.get_height()

              left = random.randint(0, stage_width)

              top = random.randint(0, stage_height)

              degree = random.randint(0, 360)

 

              while left+self.width > stage_width:

                     left = random.randint(0, stage_width)

 

              while top+self.height > stage_height:

                     top = random.randint(0, stage_height)

 

              self.set_position(left, top, degree)

                    

 

       def set_position(self, x, y, degree):

              self.x = x

              self.y = y

              self.degree = degree

              self.group.set_position(x, y)

              self.group.set_rotation(clutter.Z_AXIS, degree, (x+self.width)/2, (y+self.width)/2, 0)

      

 

def main(args):    

       if len(args) < 2:

              print "The number of arguments is less than 2!"

              return -1

 

       path=args[1]

       if not os.path.exists(path):

              print path, "doesn't exist!"

              return -1

 

       stage = clutter.Stage()

       stage.set_size(STAGE_WIDTH, STAGE_HEIGHT)

       stage.set_color(clutter.Color(0x00, 0x00, 0x00, 0x00))

      

 

       if not path.endswith(os.sep):

              path+=os.sep

 

       filelist = os.listdir(path)

      

       for item in filelist:

              pic=Photo(path+item, stage)

              pic.set_random_position()

             

       stage.show_all()

       clutter.main()      

 

 

if __name__ == '__main__':

       sys.exit(main(sys.argv))

 

基本思路:用ClutterTexture裝載圖片,ClutterRectangle做相片的邊框,通過ClutterGroup將兩者組合,然後隨機產生相片的位置與角度,通過ClutterActor類提供的方法進行設定。

Demo的使用方法:安裝pyclutter :)。假設原始碼儲存為cimage.py,存放圖片的目錄為/home/images,則在命令列下執行#./cimage.py /home/images即可。

Demo的功能非常簡單,希望通過這個Demo能使大家瞭解ActorStage的一些基本用法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21255398/viewspace-594845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章