NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Ruby Shoes:用户界面、图形及动画的轻量之选

  • 2007-09-20
  • 本文字数:2680 字

    阅读完需:约 9 分钟

人们总是在不断在Ruby GUI领域进行尝试。现已知的老式方法包括:将 Ruby 绑定到 Qt 或者 GTK 这样的用户界面库,或者使用基于 JRuby 的嵌入式 DSL 或者 API 创建 Swing 界面,关于后者,可以看看这边 3 种不同的实现途径。上述几种方法均采用不同的方法创建及排列界面控件。

Ruby Shoes 实现 GUI 的方式则略显不同。Ruby Shoes 出自 Why’s (Poignant) Guide to Ruby 的作者 Why The Lucky Stiff之手,这位高产的开发者还开发了 HPricot (HTML 解析器)、Web 框架 Camping 许多软件。Why 的Ruby Shoes 工具箱基于 Cairo (绘图)以及 Pango (文本)等 GTK 技术开发,GUI 控件的数目受限于设计,而且现有的控件使用到了系统相关的 GUI 组件。目前我们可以在 MacOSX、Windows 以及 GTK 图形环境下使用它。

Ruby Shoes 用 C 语言实现,并通过 Ruby 扩展库同 Ruby 代码交互。在自述文件中,作者声称受到了 HyberCard 这样的工具包, Processing 以及 NodeBox 这样的语言的启发。我们可以通过 Ruby Shoes 自带的样例代码,看出后面几种专门用于完成可视化(Visualization)任务的近代语言对它的影响。下面的代码片段实现了一个简单的计时器动画

l = text "0"<br></br>animate(24) do |i|<br></br> l.replace "#{i}"<br></br>end``animate调用使用一种十分简洁的方法处理动画。数字参数表示了动画的帧速,程序根据该速率执行代码块以更新动画。

Ruby Shoes 还支持通过线条、椭圆以及路径这些基本元素来创建图形,并支持变形、缩放、旋转这样的操作。接下来的这个例子展示了如何响应鼠标的移动。

Shoes.app do<br></br> radius = 20.0<br></br> vert = width - 30.0<br></br> hor = width - 30.0<br></br> o = oval(hor, vert, 10.0)<br></br> animate(10) do |anim|<br></br> nofill<br></br> clear do<br></br> oval(hor - radius, vert - radius, radius * 2.0)<br></br> satellites = vert / 10<br></br> satellites.to_i.times {|x|<br></br> h = hor + Math::sin(((6.28 / satellites) * x )) * 40.0<br></br> v = vert - Math::cos(((6.28 / satellites) * x )) * 40.0<br></br> fill rgb(1.0 / satellites, 1.0 / satellites, 0.8)<br></br> oval(h, v, 5.0)<br></br> }<br></br> skew vert / 10 * Math::cos(anim)<br></br> end<br></br> end<br></br> motion do |x, y|<br></br> hor, vert = x, y<br></br> end<br></br>end借助它的动画及图形功能,像课件设计及可视化这样的图形应用变得简单了。这并不令人惊讶,因为 Ruby Shoes 本身源于 Hackety 项目,其初衷就是为编程新手降低编程的门槛。

另一方面,通过示例,我们还可以看到它使用了Web 的理念。Ruby Shoes 引入了URL接,使得界面行为的实现更为简易,而且,在图形界面中,设置和处理链接同样简单。下面的示例是一个简单的类 / 对象浏览器,用一个可分页的列表展示所有已加载的类,每个类都是一个链接,点击链接,会显示该类的所有实例。

1 module Util<br></br>2 def self.find_objects(name, from=0, to=10)<br></br>3 objects = []<br></br>4 c = 0<br></br>5 # get the class object from its name string<br></br>6 name_const = eval(name)<br></br>7 ObjectSpace::each_object( name_const ){|x|<br></br>8 if c >= from<br></br>9 objects << x<br></br>10 end<br></br>11 break if c >= to<br></br>12 c += 1<br></br>13 }<br></br>14 objects.sort{|first, second| first.to_s <=> second.to_s }<br></br>15 end<br></br>16 end<br></br>17 class ClassList < Shoes<br></br>18 url '/', :index<br></br>19 url '/objects/(\d+)', :object<br></br>20 url '/next', :next_page<br></br>21 url '/prev', :prev_page<br></br>22 def index<br></br>23 @@from = 0<br></br>24 object(0)<br></br>25 end<br></br>26 def next_page<br></br>27 @@from += 10<br></br>28 object(@@from)<br></br>29 end<br></br>30 def prev_page<br></br>31 @@from -= 10<br></br>32 object(@@from)<br></br>33 end<br></br>34 def object(num)<br></br>35 @@from ||= 0<br></br>36 num = num.to_i<br></br>37 stack :width => 500 do<br></br>38 flow :width => 200, :margin => 10, :margin_left => 200, :margin_top => 20 do<br></br>39 obj = Util::find_objects(@@objects[num].to_s)<br></br>40 text "#{obj.size}:" + obj.join(',')<br></br>41 end<br></br>42 flow :width => 380, :margin_left => 10 do<br></br>43 @@links = text ""<br></br>44 links = ""<br></br>45 if @@from >= 10<br></br>46 links += "<a href='/prev'>prev</a>\n"<br></br>47 end<br></br>48 @@objects[@@from, @@from+10].each_with_index{|el, idx|<br></br>49 links += "<span> <a href='/objects/#{@@from + idx}'>#{el}</a></span>"<br></br>50 }<br></br>51 links += "<a href='/next'> next</a>"<br></br>52 @@links.replace links<br></br>53 end<br></br>54 end<br></br>55 end<br></br>56 end<br></br>57 @@objects = Util::find_objects("Class", 0, 200)<br></br>58 Shoes.app :width => 640, :height => 700, :title => "Classes"上述代码显示了 Ruby Shoes 中的一些理念:

  • 给 URL 模式赋予处理函数的 URL路由功能
    18 到 21 行展示了 URL 是如何映射到处理方法的。很容易看出来,应用的根是对应到index方法的。同理,objects 目录下的所有地址匀对应到object方法,而斜线符号后的所有信息都作为参数传给处理函数。这种处理事件的方式要比另一种界面交互方式——发布 / 订阅模式——简单多了。
  • flowstack等布局方法

综上所述,哪怕只是因为它那些不同于其他 GUI 的理念,Ruby Shoes 也是绝对值得一试的。但是,如其作者所言,目前项目还处于开发阶段,将其投入实际使用还为时尚早,因为目前有些理念仍存变数。另外,目前文档缺乏,也是阻挠其推广的一大因素。

尽管如此,Ruby Shoes 的动画及图形功能使搭建快速应用原型极为容易。关于 Ruby Shoes 的更多信息请参考 RubyInside 提供的 Ruby Shoes 资源列表,或者求助一下攻略,使用简单 GUI 组件上手或者从 2D 功能上上手。

查看英文原文: Ruby Shoes for lightweight GUIs, graphics and animation - - - - - -

译者简介:苏宇,网名 beanworms,软件工程师,开源项目 XRuby 成员。爱好广泛,尤喜烹饪。乐于寻找更好的解决问题的方法,目前对 Ruby 技术颇为着迷,个人 blog 为: http://azure-sky.javaeye.com/ 。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2007-09-20 03:306644

评论

发布
暂无评论
发现更多内容

Java8的这些集合骚操作,你掌握了嘛?

爱好编程进阶

Java 面试 后端开发

Java面试必备:阿里首发面试通关宝典震撼开源,文档

爱好编程进阶

Java 面试 后端开发

哪家堡垒机好用?过来人指点一下!

行云管家

数据库 数据安全 堡垒机

Github神作!2021Java秋招高级面试指南,吃透至少阿里P6

爱好编程进阶

Java 面试 后端开发

HCIE云计算--灾备

爱好编程进阶

Java 面试 后端开发

Java 线程池原理分析

爱好编程进阶

Java 面试 后端开发

Java-8新特性:学习如何使用Lambda表达式(二

爱好编程进阶

Java 面试 后端开发

Java-String-对象,你真的了解了吗?

爱好编程进阶

Java 面试 后端开发

使用APICloud & 科大讯飞SDK快速实现语音识别功能

YonBuilder低代码开发平台

前端开发 语音识别 APP开发 APICloud 科大讯飞

gRPC学习之六:gRPC-Gateway集成swagger

爱好编程进阶

Java 面试 后端开发

天翼云发布基于欧拉双版本的自研操作系统——CTyunOS

天翼云开发者社区

应对“反洗钱”,银丰新融反洗钱自主监测系统为机构保驾护航

华为云开发者联盟

数据库 分布式架构 GaussDB 反洗钱 鲲鹏云

ForkJoin实现分而治之

爱好编程进阶

Java 面试 后端开发

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

爱好编程进阶

Java 面试 后端开发

SFTP是什么协议?优势有哪些?与FTP有什么不同?

行云管家

运维 ftp sftp

基于Feature Flag的下一代开发模式

字节跳动数据平台

字节跳动 AB testing实战 ab测试

行业分析| 互联网医疗的发展

anyRTC开发者

音视频 实时通讯 在线医疗 远程问诊 互联网医疗

java进阶篇02、注解、反射与动态代理

爱好编程进阶

Java 面试 后端开发

深入浅出聊Taier—大数据分布式可视化DAG任务调度系统

袋鼠云数栈

大数据 开源 分布式 前端

星环科技创始人孙元浩:数据连接一切,开启融合数据云时代

星环科技

Java程序员福音!蚂蚁+字节

爱好编程进阶

Java 面试 后端开发

TiDB 6.0 的「元功能」:Placement Rules in SQL 是什么?

Geek_2d6073

重磅!业界首个云原生批量计算项目Volcano正式晋级为CNCF孵化项目

华为云开发者联盟

云原生 Volcano 批量计算 cncf

珠宝行业电子秤串口程序开发

108518

珠宝行业erp 珠宝天平 电子秤

Java字符串转码

爱好编程进阶

Java 面试 后端开发

Java学习路线图(如何快速学Java)

爱好编程进阶

Java 面试 后端开发

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子(1)

爱好编程进阶

Java 面试 后端开发

Java面试-volatile的内存语义

爱好编程进阶

Java 面试 后端开发

无聊科技正经事周刊(第2期):线上马拉松你会参加吗?

潘大壮

程序员 周刊 科技周刊

自主研发,自主可控,星环科技“魔方底座”全面升级!

星环科技

学习管理管理系统解决方案

低代码小观

学习方法 企业管理 企业管理系统 教育管理 CRM系统

Ruby Shoes:用户界面、图形及动画的轻量之选_Ruby_Werner Schuster_InfoQ精选文章