缩放图像导致 AS3 Flex AIR 移动应用程序崩溃

     2023-02-25     49

关键词:

【中文标题】缩放图像导致 AS3 Flex AIR 移动应用程序崩溃【英文标题】:Scaling Image Causes Crash In AS3 Flex AIR Mobile App 【发布时间】:2016-05-26 16:35:24 【问题描述】:

问题:

通过使用矩阵缩放和移动来放大图像会导致应用耗尽内存并崩溃。

使用的其他库:

Gestouch - https://github.com/fljot/Gestouch

说明:

在我的 Flex Mobile 应用程序中,我有一个组内的图像,使用 Gestouch 库启用了平移/缩放。缩放在一定程度上起作用,但会导致应用在某个缩放级别后死机(不是冻结,只是退出),并且没有错误消息。

这将是可控的,但我不知道如何实现一个阈值来停止缩放,因为它几乎每次都会在不同的缩放级别崩溃。我还使用动态图像,因此图像的来源可以是任何尺寸或分辨率。

它们通常是 JPEGS,大小在 800x600 - 9000x6000 之间,并且是从服务器下载的,因此无法与应用程序打包。

从 AS3 文档开始,BitmapData 对象的大小不再受到限制,因此这应该不是问题。

“从 AIR 3 和 Flash player 11 开始,BitmapData 对象的大小限制已被删除。位图的最大尺寸现在取决于操作系统。”

该组用作标记层,用于覆盖引脚。

崩溃主要发生在 iPad Mini 和较旧的 Android 设备上。

我尝试过的事情已经尝试过:

1.使用 Adob​​e Scout 定位内存泄漏发生的时间。

2.调试以查找崩溃时标记层和图像的确切高度和宽度。

3.根据图像大小设置最大缩放变量。

4.在缩放时裁剪图像以仅显示可见区域。 (copyPixels 函数和 BitmapData.draw() 函数崩溃)

5.使用imagemagick制作质量较低的图片(小图片仍然崩溃)

6. 使用 imagemagick 制作非常低分辨率的图像并制作更小的图像网格。使用 List 和 Tile 布局在移动应用中显示。

7.添加事件监听器时使用弱引用。

任何建议将不胜感激。

谢谢

            private function layoutImageResized(e: Event):void
        
            markerLayer.scaleX = markerLayer.scaleY = 1;
            markerLayer.x = markerLayer.y = 0;

            var scale: Number = Math.min(width / image.sourceWidth , height / image.sourceHeight);              
            image.scaleX = image.scaleY = scale;                
            _imageIsWide = (image.sourceWidth / image.sourceHeight) > (width / height);

            // centre image
            if(_imageIsWide)
            
                markerLayer.y =  (height - image.sourceHeight * image.scaleY ) / 2 ;
            
            else
            
                markerLayer.x = (width -image.sourceWidth * image.scaleX ) / 2 ;
               
            // set max scale                                
            _maxScale = scale*_maxZoom;         
        



private function onGesture(event:org.gestouch.events.GestureEvent):void
        
            trace("Gesture start");
            // if the user starts moving around while the add Pin option is up 
            // the state will be changed and the menu will disappear
            if(currentState == "addPin")
            
                return;
            

            const gesture:TransformGesture = event.target as TransformGesture;                  
            ////trace("gesture state is ", gesture.state);
            if(gesture.state == GestureState.BEGAN)
             
                currentState = "zooming";

                imgOldX = image.x;
                imgOldY = image.y;

                oldImgWidth = markerLayer.width;
                oldImgHeight = markerLayer.height;

                if(!_hidePins)
                
                    showHidePins(false);
                                   
            

            var matrix:Matrix = markerLayer.transform.matrix;
            // Pan
            matrix.translate(gesture.offsetX, gesture.offsetY);
            markerLayer.transform.matrix = matrix;

            if ( (gesture.scale != 1 || gesture.rotation != 0) && ( (markerLayer.scaleX < _maxScale && markerLayer.scaleY < _maxScale) || gesture.scale < 1 ) && gesture.scale < 1.4 ) 
            
                storedScale = gesture.scale;
                // Zoom
                var transformPoint:Point = matrix.transformPoint(markerLayer.globalToLocal(gesture.location));
                matrix.translate(-transformPoint.x, -transformPoint.y);
                matrix.scale(gesture.scale, gesture.scale);
                /** THIS IS WHERE THE CRASH HAPPENS **/
                matrix.translate(transformPoint.x, transformPoint.y);
                markerLayer.transform.matrix = matrix;

            


【问题讨论】:

您使用 Scout 发现了什么? 【参考方案1】:

我想说,在移动设备上使用 (9000x6000) 这样的大图像不是一个好主意。 我想您正在尝试实现某种地图导航,因此您需要大幅缩放某些区域。

我的解决方案是将 9000x6000 拆分为 2048x2048 块,然后使用启用 mipmap 的 png2atf 实用程序对其进行压缩。 然后就可以使用 Starling 轻松加载这些 atf 图像并将其添加到 stage3d 并轻松管理它。 如果您正在处理 9000x6000 图像 - 您将获得大约 15 个 2048x2048 块,将它们全部添加到舞台上,您可能会认为它会很重,但 mipmap 会做到这一点,因此只有很小的图像缩略图一直在内存中,直到它们没有被放大 - 所以你永远不会耗尽内存,以防你在放大时不时从舞台上移除不可见的部分,然后在缩小时返回它

【讨论】:

您好奥列格,感谢您的回复。几个月前,我使用与您提出的类似解决方案解决了这个问题,除了使用 imagemagick 和创建图像组件网格。我会研究 mipmap 看看是否有可能提高性能

使用as3和flex4.5重新启动air应用程序

IwasstrugglingtofindawaytorestartanAdobeAirapplicationprogrammedusingflex4.5andAS3,thisisamodificationofcodefoundaroundtheweb.publicfunctionreboot():void{ varapp:WindowedApplication=FlexGlobals.topLevelApplicationasWindowedApplication; varmgr:ProductManager=newProductManager(&q... 查看详情

Flex 4.6 AIR 3.2 TextInput 工件

...见,Flex已调整视图大小,以便软kb与TextInput可见。但这会导致所有Text 查看详情

[flex]as3.0实现基于air的简单浏览器

<?xmlversion="1.0"encoding="utf-8"?><s:WindowedApplicationxmlns:fx="http://ns.adobe.com/mxml/2009"xmlns:s="library://ns.adobe.com/flex/spark"xmlns:mx="library://ns.adobe.com/flex/mx"width="80 查看详情

AS3 图像在内部旋转/缩放以适合精灵

】AS3图像在内部旋转/缩放以适合精灵【英文标题】:AS3imagerotatewithin/scaletofitsprite【发布时间】:2014-07-2216:24:19【问题描述】:我们正在从想要拍摄图像并在其中旋转/缩放以适应的精灵制作位图数据。这是我们的代码,其中包含... 查看详情

使用 javascript 的 flex air 移动通信

】使用javascript的flexair移动通信【英文标题】:flexairmobilecommunicationwithjavascript【发布时间】:2013-01-2106:09:42【问题描述】:我有一个教育应用程序,其中包含三个组件,即;android通信引擎、flex内容桥和flash内容。现在我的任务... 查看详情

如何移动和缩放图像[关闭]

】如何移动和缩放图像[关闭]【英文标题】:HowtomoveandscaleanImage[closed]【发布时间】:2012-10-0809:44:24【问题描述】:我的android应用程序中有一个Imageview。我想移动和缩放图像。我还想裁剪图像的选定部分(就像照片/图像编辑器一... 查看详情

如何在 as3 中平滑图像的“缩放”和“平移”

】如何在as3中平滑图像的“缩放”和“平移”【英文标题】:Howtosmooth\'zoom\'and\'pan\'ofimageinas3【发布时间】:2019-01-1507:34:08【问题描述】:我在Adob​​eAnimate中使用ActionScript3来缩放和平移绘图。每当单击控制面板中的中心按钮时... 查看详情

使用 AS3 AIR 在移动设备上滚动?

】使用AS3AIR在移动设备上滚动?【英文标题】:ScrollingonmobiledevicesusingAS3AIR?【发布时间】:2019-12-1423:57:46【问题描述】:我已将XML调用按钮生成到影片剪辑中。这是代码importflash.display.MovieClip;importcom.greensock.*;importcom.greensock.easing... 查看详情

Flex 4.6 缩放事件

】Flex4.6缩放事件【英文标题】:Flex4.6ZoomEvent【发布时间】:2012-12-1401:52:02【问题描述】:我刚刚在Flex4.6中为移动应用程序启动一个新项目,需要一些帮助来决定如何继续。嗯,基本上该应用程序会显示一个15x15的棋盘,就像拼... 查看详情

从 AS3/OpenLaszlo 中实例化 Flex 应用程序

】从AS3/OpenLaszlo中实例化Flex应用程序【英文标题】:instantiatingaFlexappfromwithinAS3/OpenLaszlo【发布时间】:2012-05-0404:03:04【问题描述】:我有一个OpenLaszlo/AS3应用程序(olapp.lzx)和一个Flex应用程序(flexapp.swc)。我想在olapp.lzx中包含flexapp.s... 查看详情

AS3:我的 AIR 应用程序应该使用啥 resolvePath?

】AS3:我的AIR应用程序应该使用啥resolvePath?【英文标题】:AS3:WhatresolvePathshouldIuseformyAIRapplication?AS3:我的AIR应用程序应该使用什么resolvePath?【发布时间】:2016-07-0803:48:15【问题描述】:我正在开发一个简单的AIR应用程序。并... 查看详情

使用 GLSurfaceView Android 进行旋转和捏合缩放的图像效果

】使用GLSurfaceViewAndroid进行旋转和捏合缩放的图像效果【英文标题】:ImageeffectswithrotationandpinchtozoomusingGLSurfaceViewAndroid【发布时间】:2014-11-0323:15:24【问题描述】:我正在开发一个应用程序来应用效果/旋转/捏合来放大图像的功... 查看详情

将 Flex 转换为 Adob​​e Air

...:按照howtoloadapicture上的教程进行操作,然后在成功后将图像URL替换为您的FlexSWF之一。看看简单地将SW 查看详情

库中的照片不会移动和缩放

】库中的照片不会移动和缩放【英文标题】:photofromlibrarywillnotmoveandscale【发布时间】:2013-03-3022:46:13【问题描述】:在我的应用中,用户可以使用以下代码从库中选择一张照片。因为我希望用户裁剪照片,所以我确保setAllowsEdit... 查看详情

缩放图像以在android中裁剪

】缩放图像以在android中裁剪【英文标题】:Scalinganimagetocropinandroid【发布时间】:2013-07-1811:55:26【问题描述】:我正在开发一个允许用户裁剪图像的android应用程序。我已经尝试过这段代码来缩放图像以进行裁剪。但是当我尝试... 查看详情

画布在 startDrag() 上移动而不调用 set x/y 或 move() - startDrag() 如何在 as3/flex 中准确工作?

】画布在startDrag()上移动而不调用setx/y或move()-startDrag()如何在as3/flex中准确工作?【英文标题】:canvasmovedonstartDrag()withoutcallingsetx/yormove()-howdoesstartDrag()exactlyworkinas3/flex?【发布时间】:2011-06-2516:50:49【问题描述】:我有一个扩展mx... 查看详情

Flex:在 AS3 中更改 Flex 组件样式

.../>但是如果您想在AS3中动态构建它并将其动态添加到Flex应用程序,而不使用组件(仅AS3)然后修改Flex的样式,例如,您可以 查看详情

垂直添加元素时如何防止背景图像在移动浏览器上缩放?

】垂直添加元素时如何防止背景图像在移动浏览器上缩放?【英文标题】:Howtopreventbackground-imagefromzoomingonmobilebrowserwhenaddingelementsvertically?【发布时间】:2019-09-0913:58:31【问题描述】:我有一个ReactJS应用程序,当我按下“发布”... 查看详情