无法访问htmlText中的嵌入图像

时间:2009-04-23 22:01:52

标签: flex htmltext

图片可以使用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 个答案:

答案 0 :(得分:10)

好的,我刚刚花了几个小时来解决这个问题,但我已经在Flash和Flex中使用了它。

在TextField

中显示图像

您可以将DisplayObjects加载到TextField <img />标签中,包括MovieClips,Sprite和嵌入式图像。

  • 在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. 保存并测试您的电影。


  8. Flex示例

    由于我们不能像在Flash中那样在库中创建新的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中正确缩放或定位。选择精灵或类似的东西。

    以下是在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属性中使用了完全限定的类名。


    最终笔记

答案 1 :(得分:3)

您可以使用完全限定的类名称来指定嵌入的图像作为htmlText中HTML img标记的src,您可以使用getFullyQualifiedClassName)来确定它们。像这样:

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

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

这比为每个可能嵌入的图像创建包装类要简单得多......

答案 2 :(得分:2)

尝试:

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

请参阅documentation

答案 3 :(得分:1)

我一直在找同样的事情。使用嵌入式图像背后的想法是防止从外部URL加载所述图像。所以接受的答案实际上并不是解决问题。我已经看过文档了,他们也在那里使用了一个URL,并且该图像不会被编译到swf中,而是会在运行时从服务器加载。他们为什么称之为嵌入式图像可能是因为它嵌入了文本,但我正在寻找的是使用嵌入在编译代码中的图像。

为什么要在htmlText中使用嵌入式图像?因为这是在工具提示中显示图像的最简单方法(您只需要覆盖默认的工具提示类来设置htmlText而不是文本,并将其设置为TooltipManager中的默认工具提示类)。在我的搜索中,我发现了这一点:http://groups.google.com/group/flex_india/browse_thread/thread/cf0aa62afaae3fdc/b21f462f8d5da117?pli=1。还没有测试它,我想这个问题将在确定链接ID时出现。当我拥有它们时,我会回来了解更多细节。

答案 4 :(得分:1)

Sly_cardinal写了一个非常有用的答案。非常感谢他! 半天我无法解决这个问题。 Sly_cardinal注意到,如果你这样做,则getQualifiedClassName(嵌入位图)图像被插入文本中,不正确只是在左上角。 Sly_cardinal提供了一个包装类。

我想追加他的回答

一个新的类包装器 ImageWrapper.as - &gt;

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'>";

就是这样。 谢谢!

答案 5 :(得分:0)

尝试

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

取自:Using the htmlText property

答案 6 :(得分:0)

使用src ='assets / img.gif',但您必须在部署应用程序SWF的服务器目录中创建assets目录,并将img.gif文件放在那里。在html中,它正在查找相对于SWF文件的文件。

这将允许您在开发和部署位置使用相同的文件和位置。

答案 7 :(得分:0)

它适用于localhost,因为您在计算机上有图像,因此您可以加载它。如果要嵌入它,则不会将其上载到指定目录中的服务器上,而是由.SWF文件本身包含。在生产输出的相应位置上传图像(从源文件文件夹中浏览以上载)。

答案 8 :(得分:0)

没有必要再打扰自己了!从现在开始导入MovieClip并不是什么大问题!在名为TextArea的新类的帮助下(不是TextArea组件,它是一个OOP类,是对原始TextField类的扩展)。

我们不再需要嵌入或库,我们可以在每个地方使用TextArea而不是Textfield,这使我们可以导入我们自己的SWF文件,如视频播放器,谈论头像或我们文本中的任何其他内容。

它具有更多功能,并不特别限于此问题。 查看www.doitflash.com了解更多信息,该网站提供平台,下载也是免费的:)