如何使Flash动画按比例缩放以适应div宽度?

3

我创建了一个详细展示我的问题的示例页面

我的网站将有一个主包装器,针对兼容浏览器设置了max-width属性。它将在最大情况下伸展到940像素。当缩小比例时,我希望swf能够与其成比例地缩放。就像应用了宽度百分比的图像一样。Flash电影的尺寸为940×360像素。

我无法找出正确的属性添加到嵌入标记中使其实现此目的。

我目前正在使用jquery flash embed,但是也可以考虑其他选项,虽然这是我理想的方案。

在示例中,我将flash背景设置为黑色。

当调整浏览器窗口大小时,flash电影不会按比例缩放到div上,只有照片会按比例缩放,留下一个空白画布(黑色),而div的高度保持不变。我不能在CSS中添加高度值。

alt text

如何使它正确缩放?添加noscale参数仅裁剪图像。 swf的高度也不会缩放。

您可以在链接的示例源代码中查看我的所有代码。

3个回答

4
感谢George Profenza提供所有的ActionScript代码。由于闪烁太多,我对ActionScript不够熟悉,不知道如何修复它。但是非常感谢您能够组合这么多内容。 我使用jQuery创建了一个解决方案。非常简单。 首先,我嵌入Flash电影,高度最大,适用于禁用CSS的人群。它仍将随着宽度缩放,但会显示像链接示例中的画布背景。
$(selector).flash({
    src: swf,
    width: '100%',
    height: '360',
});

//get ratio from native width and height
var nativeWidth = 940;
var nativeHeight = 360;
var ratio = nativeWidth/nativeHeight;

var containerWidth = $(selector).width();
var containerHeight = containerWidth/ratio;
$(selector+' embed').height(containerHeight);

//resize flash movie
$(window).resize(function() {
    containerWidth = $(selector).width();
    containerHeight = containerWidth/ratio;
    $(selector+' embed', selector+' object').height(containerHeight);
    $(selector).height(containerHeight);
});

当浏览器窗口大小改变时,需要将视频的大小调整为适应新的窗口大小,并根据原始宽高比计算新的高度。虽然这段代码可以进行大量的优化,但我希望它能帮助其他人避免数小时的烦恼。


4

那篇文章真是太棒了。我已经寻找纯CSS解决方案有一段时间了,但这篇文章从未出现在搜索结果中。谢谢! - hndcrftd

3

我有几个想法,从使用ExternalInterface从javascript调用actionscript函数,到传递FlashVars到swf以让swf知道div的大小,再到一个更简单的想法。

以下是我的想法。

将1个MovieClip作为背景,1个MoveClip包含头部。

我认为你最好选择你的示例中的“这是顶部的flash电影”选项。最好设置:

stage.scaleMode = StageScaleMode.NO_SCALE;

或者
stage.scaleMode = StageScaleMode.SHOW_ALL;

这个想法是让内容按比例缩放。

然后,您需要添加一个事件监听器来监听调整大小的事件,并缩放/重绘背景。

stage.addEventListener(Event.RESIZE, stageResizeHandler);

function stageResizeHandler(event:Event = null):void{
   //assuming your background is called "background"
   background.width = stage.stageWidth;
   background.height = stage.stageHeight;
   //if content needs recentering, assuming "content" is the name used
   content.x = (stage.stageWidth - content.width) * .5;
   content.y = (stage.stageHeight - content.height * .5;
}

我已经为事件处理程序参数设置了一个默认值,因此您可以在不触发事件的情况下调用该函数。

例如:

stageResizeHandler();

替代

stage.dispatchEvent(new Event(Event.RESIZE));

你可能需要在初始化时调用该函数,不确定。

另外,您需要根据舞台的大小按比例调整内容的大小。以下是我测试过的一些代码:

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;


stage.addEventListener(Event.RESIZE, stageResizeHandler);

stageResizeHandler();

function stageResizeHandler(event:Event = null):void{
    //resize bg
    bg.width = stage.stageWidth;
    bg.height = stage.stageHeight;

    //scale proportionally
    if(content.width > stage.stageWidth || content.height > stage.stageHeight){
        var ratio:Number = getRatio(content);
        if(stage.stageWidth > stage.stageHeight){
            content.height = stage.stageHeight;
            content.width = content.height * ratio;
        }else 
        if(stage.stageWidth < stage.stageHeight){
            content.width = stage.stageWidth;
            content.height = content.width / ratio;
        }
    }else {
        content.scaleX = content.scaleY = 1;
    }

    //centre
    content.x = (stage.stageWidth - content.width) * .5;
    content.y = (stage.stageHeight - content.height) * .5;
}

function getRatio(target:MovieClip):Number{
    var ratio:Number; 
    target.width > target.height ? ratio = (target.width / target.height) : ratio = (target.height / target.width);
    return ratio;
}

很不幸,我注意到在某些尺寸下会出现闪烁。我猜测这是由于缩放和比例变化频繁导致的。


谢谢你的建议,不幸的是我应该明确说明这只是一个示例图像。闪光灯将是各种图像的照片幻灯片。我会更改示例,以避免误导。我真的很感激你认真考虑了所有这些。这本来是解决问题的好方法。 - user73119
没问题。我意识到我忘记了调整内容大小的部分,所以我编辑了我的答案。谢谢你提醒我。希望这可以帮到你。 - George Profenza
哇,这很酷。我不太擅长AS,所以要花一些时间来处理这个。感谢您的方法并编写所有代码。这是一个非常有趣的想法。我会回复你并让你知道进展如何。真的,再次感谢! - user73119
很高兴能帮上忙!不过我还没有解决那个闪烁的问题,现在也没有时间。你可以在这里获取我使用的 fla 文件:http://lifesine.eu/tests/scaling.fla - George Profenza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接