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


近頃の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をビルドしてみましょう。

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

考察

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のサイズと同じにしてやりました。

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

他のにも

今回は空の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から子はみ出し問題の起こし方が分かっただけで収穫と言えます。
これでもはみ出るとか、こうやればはみ出ませんよなどありましたら教えてください。