2013-06-16 2 views
2

Задача состоит в том, чтобы нарисовать пользовательскую форму с использованием графического метода curveTo.Рисунок с использованием кривой To

Проблема в том, что соединения путей не являются точными.

Результат:

callout

<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 

     protected function application1_creationCompleteHandler(event:FlexEvent):void 
     { 
      // TODO Auto-generated method stub 

      test.graphics.clear(); 
      test.graphics.lineStyle(1); 
      drawBorder(test.graphics, 200, 200); 
     } 

     private function drawBorder(g: Graphics, width: Number, height: Number): void 
     { 
      var cornerRadius: int = 20; 
      var pointerWidth: int = 4; 
      var pointerHeight: int = 10; 
      var pointerBottomGap: int = 6; 

      width -= pointerWidth; 

      g.moveTo(0, height - cornerRadius); 
      g.lineTo(0, cornerRadius + 1); 
      g.curveTo(0, 0, cornerRadius, 0); 
      g.lineTo(width - cornerRadius, 0); 
      g.curveTo(width, 0, width, cornerRadius); 
      var pointerY: int = height - pointerHeight - pointerBottomGap; 
      g.lineTo(width, pointerY); 
      g.lineTo(width + pointerWidth, pointerY + pointerHeight); 
      g.lineTo(width - pointerWidth, pointerY + pointerHeight + 1); 
      g.curveTo(width - pointerWidth, height, width - cornerRadius, height); 
      g.lineTo(cornerRadius, height); 
      g.curveTo(0, height, 0, height - cornerRadius); 
     } 

    ]]> 
</fx:Script> 

<mx:UIComponent 
    id="test" 
    x="100" y="100"/> 

вопрос можно перефразировать - Как нарисовать прямоугольник с угловым радиусом, используя curveTo метод?

+0

Я полагаю, что это какое-то упражнение? Потому что гораздо проще рисовать такие основные формы, как примитивы. – RIAstar

+0

Нет, это настоящая задача. Это дизайн чат-сообщения, поэтому он должен быть изменен. Как я могу достичь этого состояния с помощью примитивов? – yrunts

+0

Насколько я могу судить, форма состоит из закругленного Rect и небольшого треугольника в левом нижнем углу. Тем не менее, если это необходимо для масштабирования, вам будет трудно удерживать треугольник в нужном месте. Вероятно, вам будет лучше использовать [Path] (http://flex.apache.org/asdoc/spark/primitives/Path.html). Я посмотрю, смогу ли я конвертировать ваш код. – RIAstar

ответ

2

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

targetSprite.graphics.lineStyle(1.0, 0x000000, 1.0, true); 
+0

Это помогает. Результат хороший. Может быть, лучше? Сравнение https://dl.dropboxusercontent.com/u/2147606/test2.png. Первое изображение - 'pixelHinting' - true, second - false; – yrunts

3

Увеличение толщины веса штриха линии поможет; а также, попробуйте уточняющие колпачки и суставы:

callout

import flash.display.CapsStyle; 
import flash.display.JointStyle; 
import flash.display.LineScaleMode; 

graphics.lineStyle(2, 
        0x0, 
        1.0, 
        true, 
        LineScaleMode.NORMAL, 
        CapsStyle.SQUARE, 
        JointStyle.MITER); 

drawBorder(graphics, 200, 200); 
+0

Да, увеличение толщины помогает, но я не мог изменить его из-за дизайна. – yrunts