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;

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM