Невозможно получить доступ к встроенным изображениям в htmlText - PullRequest
3 голосов
/ 24 апреля 2009

Изображения могут быть включены в TextArea элементы управления с помощью свойства htmlText:

ta.htmlText = '<img src="http://..."/>';

Как мне ссылаться на встроенные изображения ?

Пример:

<mx:TextArea xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            [Embed(source='../assets/img.gif')]
            public var img:Class;
        ]]>
    </mx:Script>
    <mx:htmlText>
        <![CDATA[
            <img src="???" />
        ]]>
    </mx:htmlText>
</mx:TextArea>

UPD:

<img src='../assets/img.gif />

работает на локальной машине, но в серверной среде выдает:

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

Как я могу это исправить?

Ответы [ 9 ]

10 голосов
/ 13 ноября 2009

Хорошо, я только что потратил пару часов, разбираясь с этим, но у меня это работает во Flash и Flex.

Отображение изображений в TextField

Вы можете загрузить объекты DisplayObjects в теги TextField <img />, включая мувиклипы, спрайты и встроенные изображения.

  • Во Flash или Flex, если вы хотите отобразить встроенное изображение, вам придется создать класс-оболочку, расширяющий класс DisplayObject (например, Sprite или MovieClip).

  • Убедитесь, что текстовое поле достаточно велико, чтобы содержать изображение. Во время тестирования я думал, что что-то не работает, когда у меня действительно было слишком маленькое TextField для отображения всего изображения.


Пример Flash

Простой пример, весь код находится на основной временной шкале.

  1. Создание динамического TextField на сцене. Дайте ему полезное имя, я называю мое txtImageTest.

  2. Изменить размер txtImageTest до приличного размера, например 300x150px.

  3. Создайте новый символ MovieClip и присвойте ему имя класса, например, imageClip1.

  4. Нарисуйте что-нибудь в своем новом клипе или поместите встроенное изображение внутри imageClip1.

  5. Вернитесь к основной временной шкале, отмените выбор всех объектов и откройте редактор Actionscript в первом кадре.

  6. Включить многострочное и перенос текста в текстовое поле:

    imageClip1.wordWrap = true;
    imageClip1.multiline = true;
    imageClip1.htmlText = "<p>You can include an image in your HTML text with the &lt;img&gt; tag.</p><p><img id='testImage' src='imageClip1' align='left' width='30' height='30' hspace='10' vspace='10'/>Here is text that follows the image. I'm extending the text by lengthening this sentence until it's long enough to show wrapping around the bottom of the image.</p>"
    
  7. Сохраните и проверьте свой фильм.


Пример Flex

Поскольку мы не можем просто создать новый MovieClip в библиотеке, как мы это делали во Flash, нам нужно создать новый класс, который выполняет ту же задачу (этот метод также работает во Flash, если вы хотите создать новый клип в библиотека).

Вот мой класс для черной треугольной пули, которая называется BlackArrow.as:

// Set the correct package for you class here.
package embed
{
    import flash.display.Sprite;
    import mx.core.BitmapAsset;

    public class BlackArrow extends Sprite
    {
        // Embed the image you want to display here.
        [Embed(source='assets/embed/triangleIcon_black.png')]
        [Bindable]
        private var TriangleImage:Class;

        public function BlackArrow()
        {
            super();

            // Instantiate the embedded image and add it to your display list.
            var image:BitmapAsset = new TriangleImage();
            addChild(image);
        }

    }
}

ПРИМЕЧАНИЕ. Не не расширяйте Bitmap (во Flash) или BitmapAsset (во Flex), поскольку они не масштабируются или не позиционируются должным образом в TextField. Выберите Sprite или что-то подобное.

Вот пример класса, который отображает это изображение в TextField:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%">

    <mx:Script>
    <![CDATA[
        import embed.BlackArrow;

        // You must include a variable declaration of the same type as your
        // wrapper class, otherwise the class won't be compiled into
        // the SWF and you will get an IOError.
        private var img2:BlackArrow;
    ]]>
    </mx:Script>

    <mx:Text id="txtResults1" width="100%" height="100%">
        <mx:htmlText>
        <![CDATA[<p>You can include an image in your HTML text with the &lt;img&gt; tag.</p><p><img id='testImage' src='embed.BlackArrow' align='left' hspace='10' vspace='10'/>Here is text that follows the image. I'm extending the text by lengthening this sentence until it's long enough to show wrapping around the bottom of the image.</p>]]>
        </mx:htmlText>
    </mx:Text>

 </mx:VBox>

Обратите внимание, что я использую полное имя класса в атрибуте src тега изображения.


Заключительные замечания

  • Изображения выравниваются по левому или правому краю текстового поля, как определено атрибутом align тега изображения. Это означает, что вы не можете расположить изображение в середине текста без непосредственного доступа к изображению.

  • Список атрибутов, поддерживаемых тегом изображения, приведен здесь:
    http://blog.coursevector.com/notes-htmltext

  • Страница TextDield LiveDoc находится здесь:
    http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextField.html

  • Функция getImageReference() - это то, что вам нужно, чтобы получить ссылку на изображения в текстовом поле:
    http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextField.html#getImageReference%28%29

  • Убедитесь, что вы используете полные имена классов в атрибуте src.

  • Убедитесь, что вы объявили переменную вашего класса-обертки, чтобы она была скомпилирована в SWF.
3 голосов
/ 20 июля 2010

Вы можете указать встроенные изображения в качестве тегов src для HTML img в htmlText, ссылаясь на них, используя их полное имя класса, которое можно определить с помощью getFullyQualifiedClassName). Вот так:

public class Example
{
    [Embed(source="myImage.png")
    public static const MyImage:Class;

    public function getHTMLImg() : String
    {
        return "<img src='" + getQualifiedClassName(MyImage) + "' />";
    }
}

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

2 голосов
/ 24 апреля 2009

Попробуйте:

<mx:htmlText>
        <![CDATA[
           <p>
            <img src='../assets/butterfly.gif' 
                 width='30' height='30' 
                 align='left' 
                 hspace='10' vspace='10'>
            </p>
        ]]>
     </mx:htmlText>

См. документацию .

1 голос
/ 19 июня 2013

Sly_cardinal написал очень полезный ответ. Большое ему спасибо! Я не мог решить эту проблему за полдня. Sly_cardinal заметил, что если вы сделаете так, getQualifiedClassName (вставлять растровое изображение) изображение вставляется в текст не правильно только в верхнем левом углу. Sly_cardinal предложил сделать класс-оболочку.

Я хочу добавить свой ответ

Обёртка нового класса ImageWrapper.as ->

package 
{
import flash.display.Bitmap;
import flash.display.Sprite;
public class ImageWrapper extends Sprite{
    public static var img:Class;
    public function ImageWrapper() {
        var bitmap:Bitmap = new img();
        addChild(bitmap);
    }
}
}

Звонок в коде:

[Embed(source = "img/MyImg.png")] var _MyImg:Class;
ImageWrapper.img = _MyImg;
tf.htmlText = "My text, and my image <img src='ImageWrapper'>";

Вот и все. Спасибо!

1 голос
/ 31 декабря 2009

Я искал то же самое. Идея использования внедренных изображений состоит в том, чтобы предотвратить загрузку указанных изображений с внешнего URL-адреса. Таким образом, принятый ответ на самом деле не решает проблему. Я видел документацию, и они тоже используют там URL, и это изображение не будет скомпилировано в SWF, но будет загружено во время выполнения с сервера. Почему они называют это встроенное изображение, вероятно, потому, что оно встроено в текст, но мне нужно использовать изображение, встроенное в скомпилированный код.

Зачем вам нужен показ встроенного изображения в htmlText? Потому что это самый простой способ отобразить изображение во всплывающей подсказке (вам просто нужно переопределить класс всплывающей подсказки по умолчанию, чтобы установить htmlText вместо текста, и установить его как класс всплывающей подсказки по умолчанию в TooltipManager). В моем поиске я обнаружил это: http://groups.google.com/group/flex_india/browse_thread/thread/cf0aa62afaae3fdc/b21f462f8d5da117?pli=1. Пока не проверял, и я думаю, проблема в том, чтобы определить идентификатор этой связи. Я вернусь с более подробной информацией, когда они у меня будут.

0 голосов
/ 04 ноября 2011

Больше не нужно беспокоиться о приятелях! Теперь импортировать MovieClips не так уж и сложно! с помощью нового класса с именем TextArea (не компонент TextArea, это класс ООП, расширение исходного класса TextField).

Нам больше не нужно встраивание или библиотека , мы можем использовать TextArea везде, где вместо Textfield, и это позволяет нам импортировать наши собственные SWF-файлы, такие как видеоплеер, говорящий аватар или что-либо еще в соответствии с нашими текстами.

У него много других функций, и он не ограничивается этой проблемой. Посетите www.doitflash.com для получения дополнительной информации, сайт предоставляет платформу и ее загрузка также бесплатна :)

0 голосов
/ 15 сентября 2009

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

0 голосов
/ 09 сентября 2009

Используйте src = 'assets / img.gif', но вам нужно будет создать каталог ресурсов в каталоге сервера, на котором развернут SWF-файл приложения, и поместить туда файл img.gif. В html ищет файл относительно SWF-файла.

Это позволит вам использовать один и тот же файл и местоположение как в местах разработки, так и в развернутых местоположениях.

0 голосов
/ 24 апреля 2009

Попробуйте

src='../assets/img.gif'

Взято из: Использование свойства htmlText

...