Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.08.2013, 19:45
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 1  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
По умолчанию Отрисовка TextField в вектор.

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

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

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

Старый 06.08.2013, 19:52
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 2  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Напишите свой класс и печатайте шейпами и мувиклипами. Боюсь стандартный текстфилд Вам не поможет.

Старый 06.08.2013, 19:56
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 3  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
Цитата:
Сообщение от Babylon Посмотреть сообщение
печатайте шейпами
Вопрос, собственно, как?! =)
Тут стоит добавить, что количество шрифтов постоянно растёт.
И забивать все глифы в мувиклипы руками - совершенно не вариант.

Старый 06.08.2013, 21:18
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 4  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Может стоит попробовать jsfl?
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 06.08.2013, 22:55
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
как вариант можно упаковать текстфилд в спрайт, которому назначать 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();
 
	}
}

Старый 07.08.2013, 00:59
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 6  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
Цитата:
Сообщение от silin Посмотреть сообщение
как вариант можно упаковать текстфилд в спрайт, которому назначать scrollRect строго по видимому тексту
Кланяюсь в ноги! Хоть и не совсем то, что хотелось бы, но разница с исходным вариантом колоссальна! Премного благодарен!

Старый 07.08.2013, 18:12
FSS вне форума Посмотреть профиль Отправить личное сообщение для FSS Найти все сообщения от FSS
  № 7  
Ответить с цитированием
FSS

Регистрация: Jun 2013
Сообщений: 16
Цитата:
Сообщение от Frost47rus Посмотреть сообщение
Кланяюсь в ноги! Хоть и не совсем то, что хотелось бы, но разница с исходным вариантом колоссальна! Премного благодарен!
Я так понимаю тебе нужно что-то вроде:
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, время: 11:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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