JavaScript では、座標に基づいて要素を取得するための document.elementfrompoint があります。座標に基づいてビューを取得するための Openlaszlo のようなものはありますか?
2 に答える
OpenLaszlo ではその機能を直接サポートしていませんが、ActionScript 3 ベースのランタイムでは、flash.display.DisplayObjectContainer#getObjectsUnderPoint()メソッドを利用できます。DHTML ランタイムでは、document.elementFromPoint(x, y)を使用でき、最新のすべてのブラウザーでサポートされる Quirksmode に基づいています。
canvas.elementFromPoint()
メソッドを実装するプログラムの例を次に示します。
<canvas debug="true">
<passthrough when="$as3">
import flash.geom.Point;
</passthrough>
<view id="background" width="100%" height="100%" bgcolor="#eeeeee" clickable="true"/>
<view id="red" x="200" y="100" width="200" height="200" bgcolor="#ff0000" opacity="0.3" clickable="true" />
<view id="green" x="150" y="200" width="200" height="200" bgcolor="#00ff00" opacity="0.3" clickable="true"/>
<view id="blue" x="250" y="200" width="200" height="200" bgcolor="#0000ff" opacity="0.3" clickable="true"/>
<handler name="onclick" reference="lz.GlobalMouse">
canvas.elementFromPoint();
</handler>
<method name="elementFromPoint"><![CDATA[
var mouseX = canvas.getMouse('x'),
mouseY = canvas.getMouse('y'),
objects = null, // array of objects at mouse pointer in SWF runtime
element = null; // The element we are looking for
Debug.info( 'mouse position: x=' + mouseX + ' / mouseY=' + mouseY );
if ($as3) {
// in SWF runtime, use the DisplayObjectContainer.getObjectsUnderPoint() method
objects = canvas.getDisplayObject().getObjectsUnderPoint(new Point(mouseX, mouseY));
element = objects[objects.length-1].owner;
} else {
// in DHTML, we can use elementFromPoint, and need to retrieve the owner view of the div
element = document.elementFromPoint(mouseX, mouseY).owner.owner;
}
Debug.info('View under mousecursor:', element);
return element;
]]></method>
</canvas>
4 つのビューがあり、1 つの背景ビューは 100% x 100% にスケーリングされます。そして 3 つのカラー ビュー: 赤、緑、青 - 青が一番上に表示されます。ビューをクリックすると、正しいビュー オブジェクトが返されます。
このコードは、Chrome 22.0、Firefox 16.0.1、および Opera 12.02 の DHTML ランタイムでテストされています。Flash はすべてのブラウザーで動作するはずですが、IE ではテストしていません。
私はそうは思わない。独自のカスタム配列またはオブザーバーオブジェクトを作成し、すべてのビューを収集してから、すべてのアイテムをループして、座標がビューの境界ボックス内にあるかどうかを確認する必要があります。Flashには、「hitTest」のようなものもあります。これは、バウンディングボックスでは不十分な場合に備えて、JavaScriptの「document.elementfrompoint」に似ており、正確なピクセルマッチングを取得できます。
セバスチャン