Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отрисовка TextField в вектор. (http://www.flasher.ru/forum/showthread.php?t=202739)

Frost47rus 06.08.2013 19:45

Отрисовка TextField в вектор.
 
Всем привет!
У меня нарисовалась следующая задача:

Есть редактор, на котором нужно разместить надписи. Они могут скейлиться, их можно таскать мышью (drag and drop). Однако, когда текстовых полей становится много - очень сложно ткнуть мышью на нужное текстовое поле.
Дело в том, что TextField создаёт квадратное пространство вокруг себя. Визуально, нужный текст находится на виду, но клик в его область получается по другому текстовому полю, с большой квадратной прозрачной областью (textField.border = true наглядно показывает, что рамка от бОльшего текстового поля закрывает всю рамку меньшего текстового поля, которое находится в дисплейлисте ниже).

Хотелось бы узнать, есть ли способ как-нибудь отрисовать текстовое поле в графику, причем так, чтобы сохранить вектор(отрисовка в Bitmap не подходит - иначе все пикселит). В Flash CS, например, текстовое поле можно задаунгрейдить комбинацией ctrl+break до состояния Shape (сначала он разбивает слово из текстового поля побуквенно в набор текстовых полей, затем - все они превращаются в шейпы). И это все скейлится как вектор, без пикселизации.
Сколько ни ищу - не могу найти способа повторить такое же программно кодом.
Заранее благодарю.

Babylon 06.08.2013 19:52

Напишите свой класс и печатайте шейпами и мувиклипами. Боюсь стандартный текстфилд Вам не поможет.

Frost47rus 06.08.2013 19:56

Цитата:

Сообщение от Babylon (Сообщение 1142819)
печатайте шейпами

Вопрос, собственно, как?! =)
Тут стоит добавить, что количество шрифтов постоянно растёт.
И забивать все глифы в мувиклипы руками - совершенно не вариант.

TanaTiX 06.08.2013 21:18

Может стоит попробовать jsfl?

silin 06.08.2013 22:55

как вариант можно упаковать текстфилд в спрайт, которому назначать scrollRect строго по видимому тексту
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var test:MyTextBox = new MyTextBox();
                        test.text = "text";
                        addChild(test);
                        test.addEventListener(MouseEvent.CLICK, test_click);
 
                }
 
                private function test_click(e:MouseEvent):void
                {
                        trace("Main.test_click > e : " + e);
 
                }
 
        }
 
}
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
 
class MyTextBox extends Sprite
{
        private var tf:TextField;
 
        public function MyTextBox()
        {
                tf = new TextField();
                tf.selectable = false;
                tf.autoSize = TextFieldAutoSize.LEFT;
                var fmt:TextFormat = new TextFormat(null, 48);
                tf.defaultTextFormat = fmt;
                addChild(tf);
        }
 
        public function get text():String
        {
                return tf.text;
        }
 
        public function set text(value:String):void
        {
                tf.text = value;
                var bmd:BitmapData = new BitmapData(width, height, true, 0x0);
                bmd.draw(this);
                scrollRect = bmd.getColorBoundsRect(0xFF000000, 0x0, false);
                bmd.dispose();
 
        }
}


Frost47rus 07.08.2013 00:59

Цитата:

Сообщение от silin (Сообщение 1142842)
как вариант можно упаковать текстфилд в спрайт, которому назначать scrollRect строго по видимому тексту

Кланяюсь в ноги! Хоть и не совсем то, что хотелось бы, но разница с исходным вариантом колоссальна! Премного благодарен!

FSS 07.08.2013 18:12

Цитата:

Сообщение от Frost47rus (Сообщение 1142845)
Кланяюсь в ноги! Хоть и не совсем то, что хотелось бы, но разница с исходным вариантом колоссальна! Премного благодарен!

Я так понимаю тебе нужно что-то вроде:
1) найди библиотеку as3potrace.swc
2)
Код AS3:

        import com.powerflasher.as3potrace.backend.GraphicsDataBackend;
        import com.powerflasher.as3potrace.POTrace;
...
...
...
                private static function _ItraceImage(curves:Sprite, bitmapData:BitmapData, color:uint):void
                {
                        var gd:Vector.<IGraphicsData> = new Vector.<IGraphicsData>();
                        var strokeFill:GraphicsSolidFill = new GraphicsSolidFill(color, 1);
                        gd.push(new GraphicsStroke(1, false, LineScaleMode.NONE, CapsStyle.ROUND, JointStyle.ROUND, 3, strokeFill));
                        gd.push(new GraphicsSolidFill(color, 1));
 
                        var potrace:POTrace = new POTrace();
                        potrace.backend = new GraphicsDataBackend(gd);
                        potrace.potrace_trace(bitmapData);
 
                        gd.push(new GraphicsEndFill());
                        curves.graphics.drawGraphicsData(gd);
                }
 
                public static function DrowTextOnSprite(asprite:Sprite, atext:TextField):void
                {
                        var d:BitmapData = new BitmapData(atext.width, atext.height, true,0xFFFFFFFF);
                        d.draw(atext);
                        _ItraceImage(asprite, d, 0);
                }

В итоге, схема получается не эффективной и требует не мало времени для загрузки!
Ну происходит следующее Векторный текст преобразуется в растр =>> растровая картинка преобразуется в векторную, но уже не как таковой текст, а как кривые...
В общем, если кто знает и подскажет другой способ выгнать текст в кривые без вектора, то буду рад узнать о нем!


Часовой пояс GMT +4, время: 17:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.