svg path не нарисован, если он горизонтально (например, y всегда равен нулю) [duplicate]

Программирование на интерфейс говорит: «Мне нужна эта функциональность, и мне все равно, откуда она».

Рассмотрим (на Java) интерфейс List по сравнению с ArrayList и LinkedList конкретных классов. Если все, о чем я забочусь, это то, что у меня есть структура данных, содержащая несколько элементов данных, к которым я должен обращаться через итерацию, я бы выбрал List (и это 99% времени). Если я знаю, что мне нужно вставить / удалить постоянное время с любого конца списка, я бы выбрал конкретную реализацию LinkedList (или, более вероятно, использовать интерфейс Queue ). Если я знаю, что мне нужен произвольный доступ по индексу, я бы выбрал конкретный класс ArrayList.

12
задан Robert Longson 1 October 2015 в 11:19
поделиться

3 ответа

Вы попадаете в последний параграф в этой части спецификации SVG

Объект ключевого словаBoundingBox не следует использовать, когда геометрия применимого элемента имеет без ширины или без высоты, например, в случае горизонтальной или вертикальной линии, даже если линия имеет фактическую толщину при просмотре из-за отсутствия ненулевой ширины хода, так как ширина штриха игнорируется для вычисления ограничивающей коробки. Если геометрия применимого элемента не имеет ширины или высоты, а объектBoundingBox указан, то данный эффект (например, градиент или фильтр) будет проигнорирован.

objectBoundingBox является значением по умолчанию для gradientUnits, поэтому вам нужно использовать gradientUnits = "userSpaceOnUse", а затем отрегулировать значения, подходящие для разных систем координат.

28
ответ дан Robert Longson 20 August 2018 в 22:30
поделиться
  • 1
    Спасибо, это сработало отлично! Я добавил gradientUnits = & quot; userSpaceOnUse & quot; к элементу градиента и изменил значение y2 в соответствии с значением y1. Успех! – foxandsticks 10 February 2014 в 18:09
  • 2
    Вы спасатель жизни! – Miguel Mota 18 November 2014 в 20:01

Роберт Лонгсон дает отличное объяснение. Но иногда userSpaceOnUse является болью, потому что он распространяет интерполяцию по всему холсту, а не только на строку.

Вместо этого вы могли бы добавить незначительную сумму к значениям, чтобы обеспечить размер bbox не равен нулю.

Например,

  <line x1="40" y1="210" x2="460" y2="210.001" stroke="url(#grad1)" stroke-width="1" />

будет рисовать прямую линию с градиентом.

11
ответ дан John Henckel 20 August 2018 в 22:30
поделиться

Предполагая, что вам не нужна какая-либо точность, вы можете изменить линию на заполненный путь ниже

<path d='M 40 209.5 L 460 209.5 L 460 210.5 L 40 210.5' fill='url(#grad1)' />

или, альтернативно, на заполненный прямоугольник, как показано ниже

<rect x=40 y=209.5 width=420 height=1 fill='url(#grad1)' />

Также интересно отметить, что эта проблема затрагивает только вертикальные и горизонтальные линии. Наклонная линия отображается правильно.

0
ответ дан Steve Brooker 20 August 2018 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: