0

ユーザーに表示される方法とは異なる方法で複数のコンポーネントを構成するスナップショットを作成したいと考えています。

画面上のレイアウトが次のようになっているとします。

<s:VGroup>
    <s:HGroup id="dynamicPopulatedGroup" />
    <mx:TabNavigator id="tabs">
        <s:NavigatorContent> <mx:LineChart id="chart1"/> </s:NavigatorContent>
        <s:NavigatorContent> <mx:LineChart id="chart2"/> </s:NavigatorContent>  
    </mx:TabNavigator>
    <mx:Legend id="legend" />
    <s:Button id="bSnapshot" />
</s:VGroup>

ただし、「スクリーンショット」は次のようにレイアウトする必要があります。

<s:VGroup>
    <s:Label>Some Title Text</s:Label>
    <mx:LineChart>The currently selected tab's chart</mx:LineChart>
    <s:HGroup>
        <s:HGroup id="dynamicPopulatedGroup" /> 
        <mx:Legend id="legend" />
    </s:HGroup>
</s:VGroup>

これは単純化された例ですが、私が達成しようとしている主な問題、つまり画面上の要素自体に影響を与えずにサンドボックス内の視覚要素を操作する方法を示しています。



Group新しいものを作成し、コードにさまざまなコンポーネントを追加してから、スクリーンショットを撮ることでこれを実行しようとしました。ただし、実際には、ビジュアル ツリーの元の場所からコンポーネントが削除されます。これが実行を終了すると、コンポーネント全体が破損します。 最初にこれらのコンポーネントのコピーを作成する必要があるのでしょうか?

var g:VGroup = new VGroup();
// label
var l:Label = new Label(); l.text = "some title"; 
g.addElement(l);
// chart
g.addElement(NavigatorContent(tabs.selectedChild).getElementAt(0)); // chart
// legend, etc.
var hgrp:HGroup = new HGroup(); hgrp.addElement(dynamicPopulatedGroup); hgrp.addElement(legend);
g.addElement(hgrp);

ImageSnapshot.captureBitmapData(g);
// then do stuff with bitmap...
4

1 に答える 1

0

ADisplayObjectは、親を 1 つだけ持つことができます。そのため、グラフ (およびその他の UI 要素) を新しい に追加すると、VGroup元のコンテナから削除されます。

これらのオブジェクトのコピーを作成することで問題は解決しますが、それは少し多すぎるようです。

ユーザーがスクリーン ショットを作成する必要があるときに、実際に新しいビュー ステートに切り替えて、目的のルック アンド フィールでコンポーネントを実際にレンダリングしてから元に戻すように、UI/UX を作り直すことができます。多くのサイトがページの「印刷可能な」バージョンを表示するのと同じ方法。

それが受け入れられない場合は、各 UI 要素の個別のスナップショットを取得し、それらをつなぎ合わせるハイブリッド アプローチを試すことができます。以下のテストされていないコードのように、ステッチが機能していると思います。

var combinedImage:Sprite = new Sprite();
var g:Graphics = combinedImage.graphics;
var bitmaps = [bitmap1, bitmap2, bitmap3];
for (var i:int = 0; i < bitmaps.length; i++)
{
    g.beginBitmapFill(bitmaps[i]);
    g.drawRect(xCoordinate,yCoordinate,bitmapWidth,bitmapHeight);
    g.endFill();
    // increment x,y,width,height - leaving this exercise for you :)
}
于 2012-07-23T17:19:42.720 に答える