是否可以在Prawn中为bounding_box添加背景颜色?
bounding_box([100, cursor], width: 80, height: 20) do
pad_top(7) { text "THIS IS TEXT", size: 8, align: :center }
stroke_bounds
end
我已尝试将其添加到bounding_box块
background_color: "CCCCCC"
我已尝试在块
中添加此内容 fill_color "CCCCCC"
background_color "CCCCCC"
似乎没有任何东西可以用于bounding_box
答案 0 :(得分:10)
这里是代码
bounding_box([200,cursor], :width => 350, :height => 80) do
stroke_color 'FFFFFF'
stroke_bounds
stroke do
stroke_color 'FFFF00'
fill_color '36DA5C'
fill_and_stroke_rounded_rectangle [cursor-80,cursor], 350, 80, 10
fill_color '000000'
end
end
答案 1 :(得分:5)
这是2008年讨论的[1](虽然显然没有引导任何地方),我也没有在手册[2]中的任何地方看到它。阅读手册? :)
关于如何完成:将所有内容放入边界框后,您可以从边界框中获取生成的宽度和高度。使用该信息,您可以使用原始矩形绘图来填充它。之后,您将不得不重新绘制内容,因为到目前为止,您将使用矩形填充在其上方绘制。
希望(可能?)还有一个更好的方法,一个你不需要画两次实际内容的方法;当你遇到它时,请务必与大家分享!
我在快速操作方法中提到的所有内容都在手册中有详细记载[2];祝你好运!
[1] https://groups.google.com/forum/#!msg/prawn-ruby/6XW54cGy0GA/RdXwL0Zo_Z8J
答案 2 :(得分:3)
EDITTED 完全 仍然需要一些工作,但试试这个
module Prawn
module Graphics
def fill_and_stroke_bounding_box(options={},&block)
current_settings = {fill_color: fill_color,
stroke_color: stroke_color,
line_width: self.line_width }
fill_color options[:fill_color] || fill_color
stroke_color options[:stroke][:color] || stroke_color if options[:stroke]
self.line_width options[:stroke][:width] || self.line_width if options[:stroke]
rectangle options[:position], options[:width], options[:height]
options[:stroke] ? fill_and_stroke : fill
box_options = convert_box_options(options)
options[:revert_before_block] ? revert(current_settings) : check_fill_visiblity(options[:text_color])
fill_color options[:text_color] || fill_color
bounding_box(box_options[:position],box_options[:options]) do
if block_given?
block.call
end
end
revert(current_settings) unless options[:skip_revert]
end
def revert(settings={})
fill_color settings[:fill_color]
stroke_color settings[:stroke_color]
self.line_width settings[:line_width]
end
def convert_box_options(options={})
converted_options = {position: options.delete(:position)}
if options.delete(:stroke)
resize_box(options)
reposition_box(converted_options)
end
converted_options.merge({options: options})
end
def resize_box(options ={})
[:width,:height].each do |param|
options[param] -= (self.line_width * 2)
end
end
def reposition_box(options)
options[:position][0] += self.line_width
options[:position][1] -= self.line_width
end
def check_fill_visiblity(text_color)
text_color ||= fill_color
warn "[WARNING] Text Will Not be visible without text_color set or revert_before_block" if text_color == fill_color
end
end
end
然后你就可以这样称呼它
fill_and_stroke_bounding_box(position:[0,cursor],
stroke:{color: "7CFC00",width: 2.mm},
text_color: "668B8B"
fill_color:"FFFFFF",
width: 19.cm, height: 100
) do
唯一需要的选项是position
,height
和width
(bounding_box
不需要height
,但由于您将其放在矩形内,因此必须指定height
。
虽然建议设置text_color
或revert_before_block
,否则块内的文字将不可见。
options
包括所有bounding_box选项,包括使用块以及以下新选项stroke:{:color,:width}
,可让您设置矩形的外部笔划。 fill_color:
设置矩形的颜色。 text_color
块内文本的颜色。 revert_before_block
会在执行块之前设置颜色,因为fill_color
控制Prawn中的text_color。如果已设置正确的颜色,则可以使用此选项代替text_color
。skip_revert
这将放弃fill_color
,stroke_color
和self.line_width
的选项在调用此方法之前设置的。如果warn
与text_color
相同,此扩展程序也会fill_color
。
希望这可以帮助别人。
答案 3 :(得分:2)
只是为Willing的答案添加另一个选项......如果有人发现这个并希望将其用于网格。
def widget
grid([2,2], [3,2]).bounding_box do
stroke do
fill_color '36DA5C'
fill_and_stroke_rounded_rectangle [cursor-bounds.height,cursor], bounds.width, bounds.height, 5
fill_color '000000'
end
text "This is text inside the box"
end
end
答案 4 :(得分:1)
这就是我的做法。
bounding_box([0, y_position], width: 200, height: 50) do
fill_color 'CCCCCC'
fill { rectangle [0, 50], 200, 50 }
text 'Hello', align: :center, valign: :center
end