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