Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как определить ширину текстового поля с картинкой? (http://www.flasher.ru/forum/showthread.php?t=96785)

Torero 07.06.2007 04:52

Как определить ширину текстового поля с картинкой?
 
Приветствую всех присутствующих. :drinks:
Столкнулся с проблемой:
Внутри .AS файла пишу примерно следующее:

Код:

s="Фотографическая Карточка<Br><img hspace='4' vspace='2' height='100' width='100' src='image2.jpg'>"
Elem=this.createTextField("elem1", this.getNextHighestDepth(), 70, 20, 68, 18);
Elem.html=true;
Elem.multiline=true;
Elem.htmlText=s;
Elem.autoSize="left";
trace(Elem._width);

При запуске, мувик выдает, что ширина Elem=253. Он тупо суммирует ширину текста с шириной картинки, игнорируя тот факт, что они на разных строках..
Отсюда, собственно, и вопрос: как определить ширину?

Torero 07.06.2007 15:22

___etc, отец, выручай.:)))))

CrazyFlasher 07.06.2007 15:32

запихнуть их в мувик и узнать _width

chingachgoog 07.06.2007 16:09

Определить ширину (высоту и прочую) надо с задержкой через setTimeout или setInterval, а не сразу.
Величину задержки надо определить эмпирически.

etc 07.06.2007 16:32

Изображение ещё не успело загрузится. И у меня нет готового неработающего примера, а свой делать лень.

Ведьмак 07.06.2007 16:54

используй onLoadInit...

this.create 07.06.2007 22:03

Цитата:

Сообщение от chingachgoog
Определить ширину (высоту и прочую) надо с задержкой через setTimeout или setInterval, а не сразу.
Величину задержки надо определить эмпирически.

Мне что-то подсказывает, что у разных людей, которые будут просматривать эту работу в интернете ( если конечно разговор идет о сайте в интернете), время загрузки будет разным.
Чтобы точно узнать это время, стоит изменить подход к созданию таких полей. Организовать загрузку картинки с помощью средств флэш, позволяющих отслеживать загрузку.

Torero 08.06.2007 14:04

Благодарю за ответы.
Насчет загрузки изображения в виде мувиклипа все ясно, но хочется решить задачу, используя именно htmlText - уж больно удобно.

Поставим вопрос по другому:
Код:

s="Фотки:<Br><img src='image1.jpg' id='xxx'><Br><img src='image2.jpg', id='xxx'><Br><img src='image3.jpg' id='xxx'>"
Elem=this.createTextField("elem1", this.getNextHighestDepth(), 70, 20, 68, 18);
Elem.html=true;
Elem.multiline=true;
Elem.htmlText=s;

Вопрос в следующем:
есть текстовое поле,(Elem), как средствами AS2 узнать сколько в нем изображений если их id нам неизвестны?

etc 08.06.2007 14:32

Можно попробовать for…in пройтись…

Torero 09.06.2007 04:18

Еще вопрос из той-же оперы...

Код:

Elem.htmlText="Фота<br><img src='image2.jpg' id='pic'>"
как узнать ширину картинки, вложенной внутрь TextField-а, зная ее id?
trace(Elem.pic._x) работает, а trace(Elem.pic._width) - нет. :umnik2:

etc 09.06.2007 04:51

А она уже загрузилась на момент запроса ширины?

Torero 09.06.2007 04:55

Вроде да.. "_x" и "_y" определяются, картинка на экране.

etc 09.06.2007 04:59

Это вовсе не значит, что на момент проверки ширины и высоты она была загружена. Координаты у неё есть, потому что уже зарезервировано.

Torero 09.06.2007 06:30

сделал следующее:
создал HTML, открывающий данную картинку, получил возможность использовать XML.onLoad и, таким образом, отслеживать момент открытия картинки. Вариант с setInterval действительно не прокатывал т.к.:
а)картинки бывают разных размеров;
б)расположены они могут быть в разных местах.
Всем большое спасибо.
Результат:
http://www.flasher.ru/forum/showthread.php?t=96892

Kikasso 09.06.2007 06:38

То, что xml загружен, совсем не значит что картинка загружена.

Torero 09.06.2007 06:44

А как тогда выловить момент загрузки картинки???

screamge 09.06.2007 07:18

Для загрузки картинки нужно использовать класс MovieClipLoader и его событие onLoadInit или onLoadComplete, onLoadInit работает лучше.

Kikasso 09.06.2007 08:06

Цитата:

Сообщение от Torero
А как тогда выловить момент загрузки картинки???

Может быть, грузить ее через MovieClipLoader, по загрузке грохнуть и грузить xml..
Тогда она в текстовое поле встанет из кеша - небольшой таймаут после загрузки xml. Это все теория.

Torero 14.06.2007 06:48

Доброго времени суток!
Решить задачку, в целом, получилось.. данный код, будучи вставленным в 1й фрейм, адекватно выравнивает текстовое поле..(autoSize не срабатывает на htmlText-е - проблема на уровне Macromedia - с этим приходится мириться.)

Код:

this.createTextField("tContent", this.getNextHighestDepth(), 0, 0, 40, 40);
tContent.html = true;
tContent.border = true;
tContent.multiline=true;
tContent.htmlText = "Дядька: <img id='pic' width='320' height='430' align='center' vspace='0' hspace='1'src='http://www.bibliotekar.ru/kVinci/14.files/image001.jpg'>";
function checkPic():Void {
        var nLoaded:Number = tContent.pic.getBytesLoaded();
        var nTotal:Number = tContent.pic.getBytesTotal();
        if(nLoaded/nTotal >= 1 && tContent.pic._width > 0) {
                trace("!");
                tContent._width = tContent.pic._width;
                tContent._height = tContent.pic._height+tContent.textHeight;
                clearInterval(nInterval);
        }
}
var nInterval:Number = setInterval(checkPic, 100);


Можно было-бы начать рассуждать про очередную победу отечественного интеллекта над буржуйской техникой, если-бы не один вопрос.. почему аналогичный код, будучи вставленным в класс у меня не работает? Где ошибка?


Код:

import mx.core.UIObject;
class classes.C extends UIObject{
        public var a:TextField;
       
public function C(){
        a=this.createTextField("tContent", this.getNextHighestDepth(),0, 0, 40, 40);
        a.html = true;
        a.multiline=true
        a.wordWrap=true;
        a.border=true;
        a.htmlText = "Мужык: <img id='pic' width='320' height='430' align='center' vspace='0' hspace='1' src='http://www.bibliotekar.ru/kVinci/14.files/image001.jpg'>";

        function checkPic(tContent:TextField){
                trace("!");
                var nLoaded:Number = tContent.pic.getBytesLoaded();
                var nTotal:Number = tContent.pic.getBytesTotal();
                if(nLoaded/nTotal >= 1 && tContent.pic._width > 0) {
                        trace("!!!");
                        tContent._width = tContent.pic._width;
                        tContent._height = tContent.pic._height+tContent.textHeight;
                        clearInterval(nInterval);
                }
        }
var nInterval:Number = setInterval(checkPic(a), 100);
}
}


this.create 14.06.2007 10:22

Цитата:

Сообщение от Torero
.. почему аналогичный код, будучи вставленным в класс у меня не работает? Где ошибка?

Что именно не работает?
На что указывает this при создании текстового поля?

Torero 14.06.2007 10:54

на экземпляр. можно вместо this указать мувик(предварительно динамически создав его) внутри которого текстфилд расположен - погоды не делает.
Вопрос снят - хелп рулит - setInterval неправильно вызвал.
Топик закрыт. Всем спасибо.


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

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