17

是否可以在 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 似乎没有任何作用

4

5 回答 5

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
于 2014-05-12T08:48:35.430 回答
6

这是在 2008 年 [1] 讨论过的(但显然没有导致任何地方),我也没有在手册 [2] 的任何地方看到它。

至于怎么做:将所有内容放入边界框后,您可以从边界框获取结果宽度和高度。有了这些信息,您可以使用原始矩形绘图来填充它。之后你必须重新绘制内容,因为现在你已经用矩形填充在它上面画了。

希望(可能?)也有更好的方法,一种不需要两次绘制实际内容的方法;当你遇到它时,一定要与大家分享!

我在上面的快速操作方法中提到的所有内容都在手册 [2] 中有精美的记录;祝你好运!

[1] https://groups.google.com/forum/#!msg/prawn-ruby/6XW54cGy0GA/RdXwL0Zo_Z8J

[2] http://prawn.majesticseaacreature.com/manual.pdf

于 2013-07-25T20:13:59.303 回答
3

完全编辑仍然需要一些工作,但试试这个

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,heightwidth (bounding_box不需要 aheight但由于您将其放置在矩形内,因此您必须指定 a height

虽然建议也设置 or ,否则块内的文本将不可见text_colorrevert_before_block

options包括所有 bounding_box 选项,包括使用块以及以下新选项stroke:{:color,:width},可让您设置矩形的外部笔划。fill_color:设置矩形的颜色。text_color块内文本的颜色。revert_before_block将在执行块之前设置颜色,因为fill_color控制虾中的 text_color。text_color如果已经设置了正确的颜色,您可以使用此选项来代替。skip_revert这将丢弃在调用此方法之前设置的fill_colorstroke_color和的选项。如果与 相同,self.line_width此扩展名也会。warntext_colorfill_color

希望这可以帮助某人。

于 2014-02-27T22:09:34.770 回答
3

这就是我的做法。

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
于 2020-05-15T13:05:07.190 回答
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
于 2015-03-31T21:42:33.433 回答