書き物

技術とか作った物の話とか愚痴文句感想など

子がビットマップではみ出る

近頃のPanelから子がはみ出る問題について、僕の中で結論が出ました。どうやらaddChildしてはみ出るものとはみ出ないものがあるようです。今回は僕が使っていてはみ出た例を示してみます。

(ActionScript3.0での制作を前提としています。MXMLで同様の問題が出るかどうかは分かりません。)

はみ出してみる

調べてみたところ、Bitmapを特定の方法で表示させたときにはみ出すようです。では早速、Panelから子をはみ出してみたいと思います。

まずは最上位に位置するMXMLファイルです。

・TestMXML.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()">
<mx:Script>
<![CDATA[
// ■アプリケーション初期化
public function initApp():void
{
addChild(new MainScreen());
}
]]>
</mx:Script>
</mx:Application>

処理としては、ただメインとなるクラスをaddChildしているだけです。(基本的に全部ASで作りたいからこんなことをしている。)

次にそのメインとなるクラスです。(実質の最上位クラス)

・MainScreen.as

package
{
import flash.display.*;
import mx.containers.*;
import mx.controls.*;
public class MainScreen extends Panel
{
// ■コンストラクタ
public function MainScreen()
{
super();
width = 200;
height = 200;
var p:Image = new Image();
addChild(p);
var BMPData:BitmapData = new BitmapData(400, 400, false, 0xeeeeee);
p.addChild(new Bitmap(BMPData));
}
}
}

後はTestMXML.mxmlをビルドしてみましょう。

f:id:asahiufo:20061101232838p:image

ほおおおらぁぁぁ....はみでたこのやろう...。

考察

BitmapをaddChildしても、親となるオブジェクトに子のBitmapのサイズが適用されていないことが原因じゃないかと思いました。試しに、MainScreen.asの

var p:Image = new Image();
addChild(p);

var p:Image = new Image();
p.width = 400;
p.height = 400;
addChild(p);

に変更してビルドしなおしてみてください。Bitmapの親であるImageのサイズをBitmapのサイズと同じにしてやりました。

f:id:asahiufo:20061101234456p:image

はみ出ずにスクロールバーが表示されました!よ~しよしよしよしよし...。

他のにも

今回は空のBitmapDataを作ってBitmapを作り、addChildするとはみ出ええぇぇ!になりましたが、同様に

[Embed(source="bitmap.png")]
var TestBMP:Class;
var p:Image = new Image();
addChild(p);
p.addChild(new TestBMP());

といったようにswfに埋め込んだビットマップをそのままImageに入れて表示させても同様にはみ出るようです。この場合も親となるImageに埋め込んだビットマップのサイズを教えてあげればスクロールバーが表示されます。また、Imageが持っているloadでこのビットマップを読み込んでやってもはみ出ないようです。

終わりに

とりあえずPanelから子はみ出し問題の起こし方が分かっただけで収穫と言えます。

これでもはみ出るとか、こうやればはみ出ませんよなどありましたら教えてください。