![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Вопрос по Flex компоненту, но в основном касается as3 геометрии, поэтому считаю здесь более правильный раздел.
Вот это RichText компонент, который позволяет размещать текст вдоль окружности (по ссылке и сорсы есть). Главная проблема в том, что изменяя радиус, сам текст тоже перемещается (попробуйте, менять первый слайдер), а нужно чтобы он выгибался оставаясь на одном и том же месте. За положение текста отвечает этот код: override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth,unscaledHeight); var angle:Number = startAngle*Math.PI/180 + startOffset/radius; graphics.clear(); var line:TextLine, atomBounds:Rectangle; var letterW:Number, letterH:Number, arcAngle:Number; var dx:Number, dy:Number, ddx:Number, ddy:Number; for (var i:int = 0; i < mx_internal::textLines.length; i++) { line = mx_internal::textLines[i] as TextLine; atomBounds = line.getAtomBounds(0); letterW = atomBounds.width; letterH = atomBounds.height; arcAngle = letterW/radius; angle+= arcAngle/2; dx = Math.cos(angle) * radius; dy = Math.sin(angle) * radius; ddx = Math.sin(angle)*letterW/2; ddy = Math.cos(angle)*letterW/2; line.x = dx+ddx; line.y = dy-ddy; line.rotation = (Math.PI/2+angle)*180/Math.PI; angle+= arcAngle/2; } } Вторая проблема, это переход от положительного радиуса к отрицательному. То есть текст должен уметь выгибаться из горизонтального положения как вверх, так и вниз. Делаем слайдер в котором движок посредине (minimum="-20" maximum="20" value="0" stepSize="1"). Теперь нужно как-то смещать центр радиуса окружности вокруг которой строится текст в зависимости от значений слайдера. По коду эта окружность никак не объявляется. Ну и получается, что для горизонтального текста (value слайдера = 0) радиус должен быть бесконечно большим. Как это реализовать тоже без понятия. Сейчас при нуле все буквы текста собираются в одну точку. Слайдер двигается дискретно, поэтому нужно как-то изменить условия, чтобы просто убрать размещение вдоль окружности при value="0", а при value="1" или value="-1" уже менять центр радиуса окружности на какое-то большое значение (текст слегка искривлен). Извиняюсь за сумбурность, сложно все это пояснить, но, надеюсь, понять меня можно.
__________________
In Code We Trust |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Нужно вводить спейсинг, расстояние между буквами.
При уменьшении радиуса увеличивается длина дуги, а значит и длина строки символов, если первый и последний должны оставаться на месте. Расстояние между буквами должно увеличиваться. Им управляет угол каждого символа — arcAngle. Сейчас он заточен на сохранение расстояния между буквами при изменении радиуса, поэтому конец строки плавает. Нужно: посчитать длину дуги (строки) для текущего радиуса, между нужными координатами первого и последнего символа. Разделить ее на длину неизогнутой строки и получить коэфициент приращения спейсинга, на который домножать arcAngle. 2. Бесконечно большой — это глобальная константа Infinity. При смещении регулятора на 1 пиксель можно считать радиус за Number.MAX_VALUE (1.79769313486231e+308). Это уже число, с которым можно работать дальше, делить, отнимать и т.д.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:37. |
|
|
« Предыдущая тема | Следующая тема » |
|
|