単一のビットマップオブジェクトを含む単一のUIComponentを持つFlexアプリケーションがあります。Flex 3では、すべてが良好でした。Flex 4では、同じコードにより、UIComponent内の子のオフセットがわかりません。
これが私の.htmlファイルのオブジェクトタグです:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="320" height="480" id="MyId">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="MyFlexApp.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffff00" />
<embed allowScriptAccess="sameDomain" allowFullScreen="false" src="MyFlexApp.swf" quality="high" bgcolor="#ffff00" width="320" height="480" name="MyAppName" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" />
</object>
これが私の.mxmlファイルです。
<?xml version="1.0"?>
<!-- usingas/UsingCDATA.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init()" width="320" height="480" backgroundColor="#FF0000" styleName="plain">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
import MyClass;
public function init() : void
{
var s:UIComponent = new MyClass();
addChild( s );
}
]]>
</mx:Script>
</mx:Application>
そしてここにMyClass.asがあります:
public class MyClass extends UIComponent
{
... <snip> ...
screenBitmap = new Bitmap( screenBitmapData );
addChildAt( screenBitmap, 0 );
// screenBitmap.x = -160;
// screenBitmap.y = -24;
var t:TextField = new TextField();
t.type = TextFieldType.INPUT;
t.border = true;
t.text = "hello";
addChildAt( t, 1 );
... <snip> ...
}
タグの背景色が黄色であることに注意してください。黄色の背景が.swfの320x480サイズを正しく埋めているのがわかります。また、アプリケーションの背景色が赤であることに注意してください。繰り返しますが、黄色が点滅した後、赤い背景が.swfの320x480サイズを正しく満たしていることがわかります。したがって、アプリケーション自体はオフセットされていないと思います。
しかし、私が見ているのは、screenBitmapオブジェクトがディスプレイ内でオフセットして表示されていることです。24ピクセル低すぎ、右に160ピクセルです(したがって、ビットマップの左端は、アプリの表示長方形のちょうど中間から始まります)。それらのオフセットがどこから来ているのかわかりません。特に、MyClassオブジェクトがApplicationオブジェクト内でオフセットされているかどうか(つまり、Applicationオブジェクトの「左パディング」が160、「上パディング」が24であるかのように)、またはMyClassオブジェクトであるかどうかはわかりません。これらのパディングがあり、その子(ビットマップとTextField)に適用されます。(ここで「パディング」を使用しているのは、Flexのドキュメントにそのような概念についての言及がない場合でも、Flexが何らかの形で行っている.cssパディングのようなものを意味します。)
2行のコメントを外すことによって
// screenBitmap.x = -160;
// screenBitmap.y = -24;
ビットマップを「正しく」表示することはできますが、ビットマップ上のマウスイベントが正しくオフセットされないため、正しくありません。もちろん、マウスイベントの処理の変化を補正することもできますが、単に盲目的に補正するのではなく、なぜシフトが発生しているのかを理解したいと思います。
TextFieldオブジェクトも含まれていることに注意してください。
var t:TextField = new TextField();
t.type = TextFieldType.INPUT;
t.border = true;
t.text = "hello";
addChildAt( t, 1 );
これは、シフトの原因となっているビットマップオブジェクトについてファンキーなものではないことを確認するためだけに行いました。テキストオブジェクトは同じシフトを取得し、左上が.swf長方形全体の中で160、24になります。
私が言ったように、私はFlex 3でこれらのオフセットを取得しませんでした。私はまったく同じコードを使用しており、現在Flex4SDKでコンパイルしています。
オフセットがどこから来ているのか考えていますか?