• Starling常见问题解决办法


    1、Android设备上阻止用户按下后退后的行为

    侦听按键事件

    //阻止后退行为
    view.stage.addEventListener(KeyboardEvent.KEY_UP,keyboardHandler);
    /**
    * 当用户按下后退,强制程序关闭
    */       
    protected function keyboardHandler(event:KeyboardEvent):void
    {
            if(event.keyCode == Keyboard.BACK)
            {
                    event.preventDefault();
                    event.stopPropagation();
                    NativeApplication.nativeApplication.exit();
            }
    }

     2、怎么让程序只能横着,不能竖着。但是可以翻转

    首先在XML设置中,不要启动landscape模式,就是像下面这样注释掉就可以:

    <!--<aspectRatio>landscape</aspectRatio>-->

    然后打开允许自动翻转:

    <autoOrients>true</autoOrients>

    然后在应用启动之后,用代码设置为横屏模式:

    stage.setOrientation(StageOrientation.ROTATED_LEFT);

    然后侦听屏幕翻转事件,阻止不需要的模式:

    //only support landscape mode
    stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, onOrientationChanging );
    /**only support landscape mode*/
    private function onOrientationChanging(event:StageOrientationEvent):void 
    {
        // If the stage is about to move to an orientation we don't support, lets prevent it 
        // from changing to that stage orientation. 
        if(event.afterOrientation == StageOrientation.UPSIDE_DOWN || event.afterOrientation == StageOrientation.DEFAULT ) 
            event.preventDefault();
    }

    3、两个手机应用可以互相调用吗

    在使用Adobe AIR进行移动应用开发的时候,我们或许会有这样的需求:假如我们开发的是两个应用(A和B),同时安装到手机上,那么能否在A中呼叫B并传递参数呢(或者反过来B操作后,再把参数返回给A)。

    目前AIR还没有直接呼叫某个APP的API,但我们可以使用手机特有的特性来实现。可以使用ANE,借助原生代码来实现,也可以使用自定义的URI来实现。具体教程参见:

    Adobe AIR研究小组:Adobe AIR移动App的互相调用实现方式

    更新:在Adobe AIR 3.5 beta中已经原生添加了这个特性

    4、AIR移动应用对图标尺寸的要求是什么?

    答:主要是看发布平台对图标的尺寸要求,以目前应用最广泛的iOS和Android平台的要求为准,我们应该准备的图片尺寸是:

    • Android: 24*24,32*32,36*36,48*48,72*72
    • iOS: 29*29,48*48,57*57,58*58,72*72,96*96,114*114,144*144,512*512

    5、AIR for iOS应用如何限定最低系统版本

    答:如果您的应用使用到了最新的iOS系统才支持的功能,就必须在应用中做一些限定了,防止不符合条件要求的系统安装了应用而导致无法运行。

    方式是在XML配置中增加:

    <key>MinimumOSVersion</key>
    <string>5.0.1</string>

    6、Starling中如何裁切纹理

    答:通过Image.setTexCoords()方法,可以改变四边形顶点对于的纹理的UV坐标(取值范围0-1),这样可以实现对纹理的一个矩形区域的裁切。比如我们只需要显示纹理右下方1/4的区域,可以这样设置:

    img.setTexCoords(0,new Point(0.5,0.5));
    img.setTexCoords(1,new Point(1,0.5));
    img.setTexCoords(2,new Point(0.5,1));
    img.setTexCoords(3,new Point(1,1));
     
    //TIPS: Starling中两个三角形组成一个四边形,而四边形的4个顶点的索引以及其位置是:
    0 1
    2 3

    7、如何在Starling中平铺图片?

    答:设置texture.repeat为true,并且设置image的UV坐标。

    代码示例:

    var birdTex:Texture = Texture.fromBitmap(new birdBMPClass() as Bitmap);
    birdTex.repeat = true;
    var bird:Image = new Image(birdTex);
    bird.width = 960;
    bird.height = 640;
    bird.setTexCoords(1, new Point(bird.width/birdTex.width, 0));
    bird.setTexCoords(2, new Point(0, bird.height/birdTex.height));
    bird.setTexCoords(3, new Point(bird.width/birdTex.width, bird.height/birdTex.height));
    addChild(bird);

    8、如何将多个纹理合并成一个纹理?

    /**
     * 克隆可视对象到一个图片
     * @param target    可视目标对象
     * @param persistent    指明纹理在经过多次绘制之后是否是持久的
     * @return 
     */        
    public static function clone(target:DisplayObject, persistent:Boolean = false):Image
    {
        if (!target)
        {
            return null;
        }
        var texture:RenderTexture = new RenderTexture(target.width, target.height, persistent);
        if (target is DisplayObjectContainer)
        {
            texture.drawBundled(function():void
            {
                var num:int = DisplayObjectContainer(target).numChildren;
                for (var i:int = 0; i < num; i++)
                {
                    texture.draw(DisplayObjectContainer(target).getChildAt(i));
                }
            });
        }
        else
        {
            texture.draw(target);
        }
        return new Image(texture);
    }

    9、如何解决Starling应用放大之后,图片之间的间隙?

    答:这可能是Stage3D在纹理取样时的算法造成的。

    方式1:使用TextureSmoothing.NONE。比如:

    var image1:TestImage = new TestImage(sAssets.getTexture("test"));
    image1.smoothing = TextureSmoothing.NONE;

    方式2:设置图像显示区域的偏移量,来避免这个问题:

    package
    {
        import starling.display.Image;
        import starling.textures.Texture;
        import flash.geom.Point;
        import flash.utils.setTimeout;
     
        /**
         * 根据缩放,自动调整尺寸的Image
         */    
        public class TestImage extends Image
        {
            public static var offset:Number = 0;
     
            public function TestImage(texture:Texture)
            {
                super(texture);
                if(offset>0)
                {
                    setPositions();
                }
            }
     
            private function setPositions():void
            {
                var w:Number = super.width+offset;
                var h:Number = super.height+offset;
                mVertexData.setPosition(0,0-offset,0-offset);
                mVertexData.setPosition(1,w,0-offset);
                mVertexData.setPosition(2,0-offset,h);
                mVertexData.setPosition(3,w,h);
            }
     
            /**@override*/
            override public function readjustSize():void
            {
                super.readjustSize();
                setPositions();
            }
            /**@override*/
            override public function setTexCoords(vertexID:int, coords:Point):void
            {
                super.setTexCoords(vertexID,coords);
                setPositions();
            }
            /**@override*/
            override public function set width(value:Number):void
            {
                super.width = value;
                setTimeout(setPositions,1);
            }
            /**@override*/
            override public function set height(value:Number):void
            {
                super.height = value;
                setTimeout(setPositions,1);
            }
     
        }
    }
    // 使用
    if(viewPort.width>stageWidth)
        TestImage.offset = 1;
  • 相关阅读:
    STL特性总述——写在前面
    C++多线程框架
    C++内存管理之unique_ptr
    ubuntu文本模式/终端中文乱码解决
    log4net日志在app.config中assembly不起作用
    解决多线程委托二义性问题
    IIS 中文文件名下载会出现403访问被拒绝
    C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义
    C# string.Split对于换行符的分隔正确用法
    knockoutJS+knockout.multimodels使用记录
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/2871634.html
Copyright © 2020-2023  润新知