Flex 3 - по диагонали рисовать текст в форме и отрегулировать размер

StackOverflow https://stackoverflow.com/questions/5488224

Вопрос

Я пытаюсь создать следующий компонент:

Введите описание изображения здесь

Просто для информации, пустое место будет содержать текстовый элемент управления, и я создаю компонент, который представляет черный угол с значком (i) и текстом «продвижения».


Часть у меня проблемы с этим компонентом, представляющим черный угол с диагональным текстом. Текст должен быть в состоянии удерживать 2 строки. И черный угол должен быть в состоянии приспособиться к размеру текста. Более того, у текста есть вращение ...

У меня есть некоторые сомнения, как это сделать:

    .
  • У меня есть разные элементы управления для каждой текстовой линии?
  • я должен нарисовать текст в форме (после того, как выполнять вращение) или я должен просто перекрывать оба компонента? [Когда я говорю о рисовании текста в форме, я имею в виду таким же образом, как спросил в это вопрос ]
  • Есть ли способ получить правильный размер формы треугольника, не делая некоторые экстравагантные расчеты?

    и ... У вас есть какие-либо «проще» способы сделать это?

    Большое спасибо за любую помощь, которую вы можете предоставить :) Я немного потерян с этим маленьким компонентом :)

    С уважением.
    Bs_c3


    Редактировать 1:

      .
    • Треугольник может иметь 2 размера: 1 размер, который будет соответствовать 1 строке, а другой размер, чтобы соответствовать 2 строкам текста.
    • текст будет отправлен в виде одной строки, поэтому его придется автоматически разделены на две строки, если это необходимо
    • Я думал, что используя графику, чтобы нарисовать форму треугольника, а затем использовать маску для создания закругленного угла -> это потому, что тот же компонент будет использоваться в других местах приложения без закругленного угла
Это было полезно?

Решение 2

Well, I finally wrote the class and this is the result:

public class Corner extends Canvas
{
    private var infoIcon:Image;
    private var text:Text;
    private var triangle:Shape;
    private var bgColor:uint;

    public function Corner()
    {
        super();

        infoIcon = new Image;

        text = new Text;
        text.rotation = -45;
        text.width = 75;
        text.maxHeight = 30;
        text.setStyle('color', '0xffffff');
        text.setStyle('textAlign', 'center');
        text.y = 53;

        this.addChild(infoIcon);
        this.addChild(text);

        triangle = new Shape;
    }

    public function build(bgColor:uint = 0x61113D):void{
        this.bgColor = bgColor;

        // info icon data

        // set text     
        text.addEventListener(FlexEvent.UPDATE_COMPLETE, textHandler);
        text.text = 'blabla';
        text.validateNow();
    }

    /**
     * 
     */
    private function textHandler(e:FlexEvent):void{
        switch(e.type){
            case FlexEvent.UPDATE_COMPLETE:
                text.removeEventListener(FlexEvent.UPDATE_COMPLETE, textHandler);
                drawTriangle();
                break;
        }
    }

    /**
     * 
     */
    private function drawTriangle():void{
        var h:int = 80;
        // check if the text has 1 or 2 lines
        if(text.height > 20)
            h = 95;

        // remove the triangle shape if it exists
        if(this.rawChildren.contains(triangle))
            this.rawChildren.removeChild(triangle);

        // draw triangle
        triangle = new Shape; 
        triangle.graphics.moveTo(0, 0);
        triangle.graphics.beginFill(bgColor);
        triangle.graphics.lineTo(h, 0);
        triangle.graphics.lineTo(0, h);
        triangle.graphics.lineTo(0, 0);
        triangle.graphics.endFill();

        this.rawChildren.addChildAt(triangle,0);

        dispatchEvent(new MyEvent(MyEvent.CORNER_UPDATED));
    }

    ...

}

Другие советы

Flex is pretty good at updating group components to whatever size thier contents become, updating dynamically on the fly..

for what your suggesting, I'd probably create the "Promotion" group in the corner as a rectangle, rotate it and fit it to the corner like you want, then using a copy of the rounded rect you use as the maing component background, i'd make a mask to cut the "Promotion" component so you don't see the overlap.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top